Comment faire changer une variable en fonction de for

Résolu/Fermé
lsda26 Messages postés 68 Date d'inscription mardi 3 avril 2007 Statut Membre Dernière intervention 6 septembre 2013 - 13 mars 2013 à 12:35
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 - 13 mars 2013 à 16:35
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"

A voir également:

3 réponses

dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
13 mars 2013 à 13:00
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
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
13 mars 2013 à 13:10
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
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
13 mars 2013 à 13:21
effectivement, c'est du sh qui ne connait pas ${!var}
0
lsda26 Messages postés 68 Date d'inscription mardi 3 avril 2007 Statut Membre Dernière intervention 6 septembre 2013
13 mars 2013 à 14:07
Merci pour l'info, je ne connaissais pas!
0
Utilisateur anonyme
13 mars 2013 à 15:42
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
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
13 mars 2013 à 16:01
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
Utilisateur anonyme
13 mars 2013 à 16:32
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
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
13 mars 2013 à 16:35
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