IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Tableau à nom variable


Sujet :

Shell et commandes GNU

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2013
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2013
    Messages : 7
    Par défaut Tableau à nom variable
    Bonjour à tous,

    Je me suis mis au bash depuis quelques mois maintenant et je voudrais créer un script necessitant plusieurs tableaux (plutot 1 tableau 2D).
    Voici comment j'ai procédé (pour un tableau de 8x8):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    declare -ai A=(0 0 0 0 0 0 0 0 )
    declare -ai B=(0 0 0 0 0 0 0 0 )
    declare -ai C=(0 0 0 0 0 0 0 0 )
    declare -ai D=(0 0 0 0 0 0 0 0 )
    declare -ai E=(0 0 0 0 0 0 0 0 )
    declare -ai F=(0 0 0 0 0 0 0 0 )
    declare -ai G=(0 0 0 0 0 0 0 0 )
    declare -ai H=(0 0 0 0 0 0 0 0 )
    J'ai pratiquement tout essayé, ce que je voudrais faire c'est me balader dans ces tableaux grâce à des variables.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $colonne=lettre rentrée par l'utilisateur (soit le nom d'un des tableaux)
    $chiffre=chiffre généré aleatoirement
    Je m'explique, je voudrais faire ceci :
    $colonne[$chiffre]=1
    Quelqu'un aurait-il une idée ?
    Merci à vous d'avance,
    Kevin

    P.S:J'arrive tout de même à faire cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for ((chiffre=0;chiffre<=7;chiffre++))
    do
    echo $(($colonne[$chiffre])) 
    done

  2. #2
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 651
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 651
    Par défaut
    Bonjour,

    t'es obligé de faire ça en bash ?

    pour ce genre de manipulation, tu vas très vite atteindre les limites de ce que peut faire un interpréteur de commande.

    il est possible d'évaluer ce type d'expression pour assigner une nouvelle donnée à un case à partir de la saisie d'un utilisateur, mais, pour des raisons de sécurité, il est recommandé de ne pas le faire.

    le shell n'est pas le langage le mieux adapté pour ce genre de travail; je t'orienterais vers un langage plus puissant perl, ou python.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2013
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2013
    Messages : 7
    Par défaut
    Oui j'y suis obligé c'est un travail demandé..
    Je maitrise beaucoup plus le C et si cela m'avait été possible le programme serait déjà terminé !
    Tu me conseilles donc de travailler avec des cases ?
    C'est vrai que ce n'est pas une mauvaise idée.
    Je continue de travailler sur le problème,
    merci pour votre réponse,

    Kevin

    P.S: En général ce qui n'est "pas recommandé" je le fais quand même quand cela m'est nécessaire et je n'ai généralement aucun souci (comme le goto en C ).
    Alors n’hésitez pas

  4. #4
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 651
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 651
    Par défaut
    Tu me conseille donc de travailler avec des cases ?
    c'est une simple observation : un tableau 8x8, ça ressemble à un plateau de 64 cases...
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  5. #5
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 102
    Par défaut
    Citation Envoyé par CrypTloader Voir le message
    Bonjour à tous,

    Je me suis mis au bash depuis quelques mois maintenant et je voudrais créer un script necessitant plusieurs tableaux (plutot 1 tableau 2D).
    Voici comment j'ai procédé (pour un tableau de 8x8):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    declare -ai A=(0 0 0 0 0 0 0 0 )
    declare -ai B=(0 0 0 0 0 0 0 0 )
    declare -ai C=(0 0 0 0 0 0 0 0 )
    declare -ai D=(0 0 0 0 0 0 0 0 )
    declare -ai E=(0 0 0 0 0 0 0 0 )
    declare -ai F=(0 0 0 0 0 0 0 0 )
    declare -ai G=(0 0 0 0 0 0 0 0 )
    declare -ai H=(0 0 0 0 0 0 0 0 )
    J'ai pratiquement tout essayé, ce que je voudrais faire c'est me balader dans ces tableaux grâce à des variables.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $colonne=lettre rentrée par l'utilisateur (soit le nom d'un des tableaux)
    $chiffre=chiffre généré aleatoirement
    Je m'explique, je voudrais faire ceci :
    $colonne[$chiffre]=1
    Bonjour. Pour ça, il y a la fonction 'eval' (mais elle est non recommandée (hé, hé!)):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $ declare -ai A=(0 0 0 0 0 0 0 0 )
    $ echo ${A[3]}
    0
    $ colonne=A; chiffre=3
    $ eval "echo \${${colonne}[${chiffre}]}"
    0
    $ eval "${colonne}[${chiffre}]=1"
    $ echo ${A[3]}
    1
    $ eval "echo \${${colonne}[${chiffre}]}"
    1

  6. #6
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2013
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2013
    Messages : 7
    Par défaut
    En réponse à N_Bah, je parlais de "case" , ce case la :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    case $var in 
    v1 ) commande 1 ;;
    v2 ) commande 2;;
    esac
    ^^

    En réponse à Jack-ft, un grand merci à toi car en faisant mes recherches sur ce sujet je n'avais pas saisi le sens de "eval" ni son utilisation..
    En tout cas c'est plus clair maintenant !

    Je ne pense pas avoir d'autres questions sur ce sujet, je passe donc en résolu en espérant que cela aidera d'autres personnes autant que vous m'avez aidé.

    Un grand merci a vous !

    A+

  7. #7
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 102
    Par défaut
    Citation Envoyé par CrypTloader Voir le message
    P.S: En général ce qui n'est "pas recommandé" je le fais quand même quand cela m'est nécessaire et je n'ai généralement aucun souci (comme le goto en C ).
    Alors n’hésitez pas
    [HS]
    Oui. Peut-être que tu n'as aucun souci...
    Peut-être que TU n'as aucun souci...

    Il arrive quelquefois que certains développeurs aient comme une sorte de furieuse envie de rencontrer celui, celle ou ceux qui ont pondu le code qu'ils ont à maintenir...

    Je ne sais pas pour quelle raison...
    peut-être pour les féliciter de leur audace de faire des choses non recommandées et de l'admiration qu'elle suscite en eux...

    PS: de l'usage modéré du goto en C...
    [/HS]

  8. #8
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    792
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 792
    Par défaut
    eval() est effectivement à éviter, surtout sur des variables introduites par un utilisateur.

    Pouquoi ne pas utiliser le remplacement de variable de bash?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #!/bin/bash
     
    declare -ai A=(0 0 0 7 0 0 0 0 )
    echo ${A[3]}
     
    colonne=A; chiffre=3
     
    b=$colonne[$chiffre]
    echo ${!b}

  9. #9
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 651
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 651
    Par défaut
    le problème de CrypTloader, n'est pas l'affichage des données d'un élément d'un tableau, dont les références seraient fournies par l'utilisateur, mais la modification des données.

    hélas, l'indirection seule n'y fera rien.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  10. #10
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2013
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2013
    Messages : 7
    Par défaut
    Nouvelle question :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    declare -ai A=(0 0 0 0 0 0 0 0 )
    declare -ai B=(0 0 0 0 0 0 0 0 )
    declare -ai C=(0 0 0 0 0 0 0 0 )
    declare -ai D=(0 0 0 0 0 0 0 0 )
    declare -ai E=(0 0 0 0 0 0 0 0 )
    declare -ai F=(0 0 0 0 0 0 0 0 )
    declare -ai G=(0 0 0 0 0 0 0 0 )
    declare -ai H=(0 0 0 0 0 0 0 0 )
     
    declare -ar AA='("□" "□" "□" "□" "□" "□" "□" "□" )'
    declare -ar BB='("□" "□" "□" "□" "□" "□" "□" "□" )'
    declare -ar CC='("□" "□" "□" "□" "□" "□" "□" "□" )'
    declare -ar DD='("□" "□" "□" "□" "□" "□" "□" "□" )'
    declare -ar EE='("□" "□" "□" "□" "□" "□" "□" "□" )'
    declare -ar FF='("□" "□" "□" "□" "□" "□" "□" "□" )'
    declare -ar GG='("□" "□" "□" "□" "□" "□" "□" "□" )'
    declare -ar HH='("□" "□" "□" "□" "□" "□" "□" "□" )'
     
    Comment puis-je faire cela ? =
    Fct_Affiche ()
    {
    case $1 in
    A) 
    eval "${AA}[${$2}]=${A}[${$2}]"
    B)........
    etc..
    Sachant qu'avec cette formule le terminal me renvoie :
    "demineur.sh: line 32: ${CC}[${$2}]=${C}[${$2}] : mauvaise substitution"
    Merci pour vos réponse,
    Cordialement,

    Kevin

  11. #11
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 651
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 651
    Par défaut
    pourquoi ${$2}?
    si tu veux utiliser le deuxième paramètre positionnel de la fonction, alors c'est seulement $2, voire ${2}.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  12. #12
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2013
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2013
    Messages : 7
    Par défaut
    Oui j'ai vu l'erreur trop tard, j'ai modifié mon script mais ça ne fonctionne toujours pas..
    J'ai essayé en faisant cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Fct_Affiche ()
    {
    ligne2=$2
    case $1 in
    A) 
    eval "AA[${ligne2}]=$A[$ligne2]}"
    echo ${AA[${ligne2}]}
    ;;
    Resultat :

    line 57: Erreur de syntaxe près du symbole inattendu « "HH[${ligne2}]=${H[$ligne2]}" »
    line 57: `eval "HH[${ligne2}]=${H[$ligne2]}"'
    Any idea ?

  13. #13
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2013
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2013
    Messages : 7
    Par défaut
    Veuillez m'excuser, plein d'erreurs d’inattention dues à la nuit passée dessus... :S
    Je fais une petite pause afin d'avoir les idées plus claires et si j'ai toujours le même problème à tête reposée je vous en ferai part.
    Cdlt,
    Kevin

  14. #14
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 651
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 651
    Par défaut
    les tableaux "double-lettres" (AA,BB...) sont en readonly, ils ne peuvent donc être modifiés.

    mais ça ne correspond pas à l'erreur que tu vois.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  15. #15
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2013
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2013
    Messages : 7
    Par défaut
    IMPOSSIBLE de les modifier tu dis ?

    Je vais remonter le probleme et m'expliquer :

    J'ai besoin de 2 tableaux, besoin de pouvoir echanger
    des valeurs des tableaux n°1 (simples lettres) vers les tableaux n°2 (dble lettres) , et SURTOUT besoin de pouvoir mettre dans ces tableaux autre chose que 1 2 3 4 5 6 7 8 9 0 ..

    Puis-je faire cela ?
    Si oui, comment ?

    D'avance merci,
    Cordialement,

    Kevin

  16. #16
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 651
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 651
    Par défaut
    IMPOSSIBLE de les modifier tu dis ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    help declare |grep -- -r
          -r        to make NAMEs readonly
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  17. #17
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 102
    Par défaut
    Citation Envoyé par CrypTloader Voir le message
    IMPOSSIBLE de les modifier tu dis ?

    Je vais remonter le probleme et m'expliquer :

    J'ai besoin de 2 tableaux, besoin de pouvoir echanger
    des valeurs des tableaux n°1 (simples lettres) vers les tableaux n°2 (dble lettres) , et SURTOUT besoin de pouvoir mettre dans ces tableaux autre chose que 1 2 3 4 5 6 7 8 9 0 ..

    Puis-je faire cela ?
    Si oui, comment ?

    D'avance merci,
    Cordialement,

    Kevin
    Si c'était pour moi, je me poserais la question suivante: que représentent ces tableaux?

    De là, je choisirais des noms clairs (pour un éventuel autre lecteur (voire moi-même!)).

    Par exemple, si un tableau indique si une case contient ou non une mine, je l'appellerais "tableau des mines", abrégé en "mine".
    De même, si un tableau symbolise un affichage, je l'appellerais "disp".

    J'aurais donc quelque chose comme:

    [code]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    declare -a mine_A=(0 0 0 0 0 0 0 0 )
    declare -a mine_B=(0 0 0 0 0 0 0 0 )
    declare -a mine_C=(0 0 0 0 0 0 0 0 )
    declare -a mine_D=(0 0 0 0 0 0 0 0 )
    declare -a mine_E=(0 0 0 0 0 0 0 0 )
    declare -a mine_F=(0 0 0 0 0 0 0 0 )
    declare -a mine_G=(0 0 0 0 0 0 0 0 )
    declare -a mine_H=(0 0 0 0 0 0 0 0 )
     
    disp_default='&''#9633;'
     
    declare -a disp_A='(${disp_default} ${disp_default} ${disp_default} ${disp_default} ${disp_default} ${disp_default} ${disp_default} ${disp_default} )'
    declare -a disp_B='(${disp_default} ${disp_default} ${disp_default} ${disp_default} ${disp_default} ${disp_default} ${disp_default} ${disp_default} )'
    declare -a disp_C='(${disp_default} ${disp_default} ${disp_default} ${disp_default} ${disp_default} ${disp_default} ${disp_default} ${disp_default} )'
    declare -a disp_D='(${disp_default} ${disp_default} ${disp_default} ${disp_default} ${disp_default} ${disp_default} ${disp_default} ${disp_default} )'
    declare -a disp_E='(${disp_default} ${disp_default} ${disp_default} ${disp_default} ${disp_default} ${disp_default} ${disp_default} ${disp_default} )'
    declare -a disp_F='(${disp_default} ${disp_default} ${disp_default} ${disp_default} ${disp_default} ${disp_default} ${disp_default} ${disp_default} )'
    declare -a disp_G='(${disp_default} ${disp_default} ${disp_default} ${disp_default} ${disp_default} ${disp_default} ${disp_default} ${disp_default} )'
    declare -a disp_H='(${disp_default} ${disp_default} ${disp_default} ${disp_default} ${disp_default} ${disp_default} ${disp_default} ${disp_default} )'
    Ensuite, je définirais des accesseurs pour chaque tableau:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    function mine_get {
      typeset lin=$1 col=$2
      # [todo] Check values...
      # bash:
      typeset form=mine_${lin}[${col}]
      echo ${!form}
      # sh:
      eval "echo \${mine_${lin}[${col}]}"
    }
     
    function mine_set {
      typeset lin=$1 col=$2 val=$3
      # [todo] Check values...
      eval "${mine_${lin}[${col}]}=${val}"
    }
    Et la même chose pour l'autre tableau.

    Voire des prédicats:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    # Return status 0 is there is a mine
    function mine_on {
      typeset lin=$1 col=$2
      # [todo] Check values...
      [[ $(eval "echo \${mine_${lin}[${col}]}") -eq 1 ]]
    }
    Pour un usage simple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if mine_on ${lin} ${col}
    then boum
    else mine_show ${lin} ${col}
    fi
    etc.

Discussions similaires

  1. Tableau avec un nom variable
    Par Invité dans le forum Shell et commandes GNU
    Réponses: 6
    Dernier message: 15/12/2012, 23h06
  2. [WD15] Comment gérer le nom d'un tableau en variable?
    Par pardet dans le forum WinDev
    Réponses: 2
    Dernier message: 15/06/2012, 14h46
  3. [Tableaux] Nom d'entrée tableau comme variable
    Par vigon dans le forum Langage
    Réponses: 3
    Dernier message: 09/08/2007, 09h45
  4. [Tableau] Nom de tableau variable
    Par Asdorve dans le forum VB 6 et antérieur
    Réponses: 17
    Dernier message: 17/05/2007, 21h08
  5. Fonction max d'un tableau de variables...
    Par Romalafrite dans le forum ASP
    Réponses: 7
    Dernier message: 20/07/2004, 10h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo