Comment faire changer une variable en fonction de for [Résolu/Fermé]

Signaler
Messages postés
68
Date d'inscription
mardi 3 avril 2007
Statut
Membre
Dernière intervention
6 septembre 2013
-
Messages postés
36299
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021
-
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

Messages postés
18240
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
30 novembre 2020
5 206
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
$ 
Messages postés
36299
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021
5 965
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

$

Messages postés
18240
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
30 novembre 2020
5 206
effectivement, c'est du sh qui ne connait pas ${!var}
Messages postés
68
Date d'inscription
mardi 3 avril 2007
Statut
Membre
Dernière intervention
6 septembre 2013

Merci pour l'info, je ne connaissais pas!

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.
Messages postés
36299
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021
5 965
Salut QQCQCPQ,

il est effectivement mal venu de lui recommander eval
Toi aussi t'as été frappé par les foudres de N_BaH ? ;-DD
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)
Messages postés
36299
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021
5 965
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? ;-)