Comment faire changer une variable en fonction de for

Résolu
lsda26 Messages postés 70 Statut Membre -  
zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,
Voilà mon script de test:
#!/bin/bash
MAC='a4:ba:db:01:01:01'
MACWIFI='1c:af:f7:02:02:02'
for j in MAC MACWIFI
do
MACTest=$(echo "\$$j")
echo $MACTest
done;

j'essai de faire apparaître l'adresse MAC correspondant au cycle de la boucle for:
quand $j = MAC alors MACTest doit être égale à "a4:ba:db:01:01:01"
et quand $j = MACWIFI alors MACTest doit être égale à "1c:af:f7:02:02:02"

Je pense avoir un problème de syntaxe avec : MACTest=$(echo "\$$j")
Même avec MACTest="\$$(echo $j)" cela m'affiche toujours "$MAC" et "$MACWIFI"

3 réponses

  1. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    hello
    il manque un eval
    $ cat f1
    #!/bin/bash 
    
    MAC='a4:ba:db:01:01:01'
    MACWIFI='1c:af:f7:02:02:02'
    for j in MAC MACWIFI
    do
    MACTest=$(eval echo \$$j)
    echo $MACTest
    done;
    
    $ ./f1
    a4:ba:db:01:01:01
    1c:af:f7:02:02:02
    $ 
    
    0
  2. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
     
    Salut,

    Mieux vaut faire avec l'indirection des variables, "eval" étant assez mal considéré ;-(

    $ cat foo.sh 
    #!/bin/bash 
    
    MAC='a4:ba:db:01:01:01'
    MACWIFI='1c:af:f7:02:02:02'
    for j in MAC MACWIFI
    do
    MACTest="$j"
    echo "${!MACTest}"
    done
    
    $ ./foo.sh 
    a4:ba:db:01:01:01
    1c:af:f7:02:02:02
    
    $

    0
    1. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
       
      effectivement, c'est du sh qui ne connait pas ${!var}
      0
    2. lsda26 Messages postés 70 Statut Membre
       
      Merci pour l'info, je ne connaissais pas!
      0
  3. Utilisateur anonyme
     
    salut,

    lsda26 utilise bash, alors il est effectivement mal venu de lui recommander eval.

    En sh, pour ne pas recourir à eval, on peut passer par un sous-shell
    #!/bin/sh
    
    MAC='a4:ba:db:01:01:01'
    MACWIFI='1c:af:f7:02:02:02'
    
    (set -- "$MAC" "$MACWIFI"; for i do echo "$i"; done)

    Et en bash, on peut utiliser un tableau associatif.
    #!/bin/bash
    declare -A MACwi=( [re]='a4:ba:db:01:01:01' [fi]='1c:af:f7:02:02:02' )
    for i in "${!MACwi[@]}"; do echo "$i = ${MACwi[$i]}"; done


    enfin, n'importe quoi plutôt que de préconiser eval.
    0
    1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      Salut QQCQCPQ,

      il est effectivement mal venu de lui recommander eval
      Toi aussi t'as été frappé par les foudres de N_BaH ? ;-DD
      0
    2. Utilisateur anonyme
       
      c'est qu'on a probablement eu le même degré de lecture du wiki de Greg Wooledge (page, qui, d'ailleurs, vient d'être mise à jour par Chris Johnson; dans mon souvenir elle était (la page ;)) plus stricte)
      0
    3. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      Il y a des années que j'ai son site en bookmark, tout comme ces pots de http://bash-hackers.org/wiki/doku.php? ;-)
      0