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?
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
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.
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
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
for I in {1..5}; do
echo $((VAR$I))
done
Oui. Voir Guide avancé de script Bash
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