Cela a pris beaucoup d'essais et d'erreurs, mais a finalement fonctionné.
Je me suis inspiré de Youness. Mais toutes les autres réponses n'ont pas aidé sur mon ancien bash (suse11sp1 [3.2.51 (1) -release])
La boucle «pour» a refusé d'étendre le tableau indirect, au lieu de cela, vous devez le pré-développer, utilisez-le pour créer un autre tableau avec votre nouveau nom de variable. Mon exemple ci-dessous montre une double boucle, car c'est mon utilisation prévue.
THEBIGLOOP=(New_FOO New_BAR)
FOOthings=(1 2 3)
BARthings=(a b c)
for j in ${THEBIGLOOP[*]}
do
TheNewVariable=$(eval echo \${${j#New_}things[@]})
for i in $TheNewVariable
do
echo $j $i" hello"
echo
done
done
J'utilise # pour supprimer le "New_" de la première entrée du tableau, puis je concatène avec "things", pour obtenir "FOOthings". \ $ {} avec echo et eval, puis faites leur travail dans l'ordre sans lancer d'erreurs, qui est enveloppé dans un nouveau $ () et attribué le nouveau nom de variable.
$ Test.sh
New_FOO 1 hello
New_FOO 2 hello
New_FOO 3 hello
New_BAR a hello
New_BAR b hello
New_BAR c hello
MISE À JOUR ##### 2018/06/07
J'ai récemment découvert une autre rotation sur ce problème. La variable créée n'est pas en fait un tableau, mais une chaîne délimitée par des espaces. Pour la tâche ci-dessus, cela était correct, en raison de la façon dont "pour" fonctionne, il ne lit pas le tableau, il est développé puis bouclé, voir l'extrait ci-dessous:
for VARIABLE in 1 2 3 4 5 .. N
do
command1
command2
commandN
done
Mais, j'ai ensuite dû l'utiliser comme un tableau. Pour cela, je devais effectuer une étape de plus. J'ai pris le code mot pour mot par Dennis Williamson . Je l'ai testé et ça marche bien.
IFS=', ' read -r -a TheNewVariable <<< ${TheNewVariable[@]}
"IFS = ','" est une variable contenant votre suppresseur. "read" avec "-a" coupe et réinjecte la piqûre dans la variable tableau. Remarque, cela n'a aucun respect pour les guillemets, mais il y a quelques options en lecture pour gérer cela, par exemple j'ai supprimé l'indicateur -r dont je n'avais pas besoin. J'ai donc combiné cet ajout dans la création de variable, ce qui permet de traiter et d'adresser les données comme il se doit.
THEBIGLOOP=(New_FOO New_BAR)
FOOthings=(1 2 3)
BARthings=(a b c)
for j in ${THEBIGLOOP[*]}
do
IFS=', ' read -a TheNewVariable <<< $(eval echo \${${j#New_}things[@]})
for i in ${TheNewVariable[@]} #Now have to wrap with {} and expand with @
do
echo $j $i" hello"
echo ${TheNewVariable[$i]} #This would not work in the original code
echo
done
done