web-dev-qa-db-fra.com

Est-il possible de construire des noms de variables à partir d'autres variables dans bash?

Je m'excuse pour le titre plutôt terrible - et le post de mauvaise qualité - mais ce que je veux faire, en gros, c'est ceci:

for I in 1 2 3 4
    echo $VAR$I # echo the contents of $VAR1, $VAR2, $VAR3, etc.

Évidemment, ce qui précède ne fonctionne pas - il va (je pense) essayer d’écrire la variable appelée $VAR$I Est-ce possible dans Bash?

28
Stephen

Oui, mais ne fais pas ça. Utilisez un tableau à la place.

Si vous persistez à le faire de cette façon ...

$ foo1=123
$ bar=foo1
$ echo "${!bar}"
123
34
for I in 1 2 3 4 5; do
    TMP="VAR$I"
    echo ${!TMP}
done

J'ai une règle générale selon laquelle si j'ai besoin d'un accès indirect à des variables (tableaux idem), il est temps de convertir le script de Shell en Perl/Python/etc. Le codage avancé dans Shell, bien que possible, devient rapidement un gâchis.

10
Dummy00001

Vous devriez penser à utiliser des tableaux bash pour ce type de travail:

pax> set arr=(9 8 7 6)
pax> set idx=2
pax> echo ${arr[!idx]}
7
4
paxdiablo

Pour le cas où vous ne souhaitez pas refactoriser vos variables dans des tableaux ...

Une manière...

$ for I in 1 2 3 4; do TEMP=VAR$I ; echo ${!TEMP} ; done

Autrement...

$ for I in 1 2 3 4; do eval echo \$$(eval echo VAR$I) ; done

Je n'ai pas trouvé de moyen plus simple qui fonctionne. Par exemple, cela ne fonctionne pas ...

$ for I in 1 2 3 4; do echo ${!VAR$I} ; done
bash: ${!VAR$I}: bad substitution
4
nobar
for I in {1..5}; do
    echo $((VAR$I))
done
3
Ahmed Mokhtar
1
gerardw

Cela ressemble vraiment à un type de situation de type tableau. Voici un lien qui contient une très bonne discussion (avec de nombreux exemples) sur l'utilisation des tableaux dans bash: Tableaux

0
Anthony