Je veux écrire un script pour référencer plusieurs tableaux d'un autre tableau qui contient les noms de variables de ces tableaux.
Voici mon code jusqu'à présent:
#!/bin/bash
array1=('array1string1' 'array1string2')
array2=('array2string1' 'array2string2')
array_names=('array1' 'array2')
for a in ${array_names[@]}
do
for b in ${a[@]}
do
echo $b
done
done
J'aimerais que la sortie balaye les deux tableaux (depuis la boucle for externe) et imprime les chaînes respectives dans la boucle for interne qui appelle l'écho. Ma sortie actuelle me montre juste:
array1
array2
Je serais reconnaissant à tout pointeur à ce sujet. Je vous remercie!
bash
shell-script
chnppp
la source
la source
for b in "${array1[@]}" "${array2[@]}"; do ...; done
?${a[@]}
pour${!a}
fait ce que vous voulez (je pense).${!a[@]}
donne une longueur du tableaua
.${!a}
me donne juste les premiers éléments.Réponses:
Bash 4.3 et versions ultérieures prennent en charge les «références de nom», ou namerefs (un concept similaire existe
ksh93
, mais la portée est énormément différente ):La variable
arr
est un nom qui agit comme un alias pour la variable nommée (la variable avec nom$a
dans cet exemple).Sans namerefs, dans les versions précédentes de Bash, une solution serait de créer un nouveau tableau contenant tous les éléments des autres tableaux:
... un peu comme le
array_names
tableau dans la question mais avec le contenu de tous les tableaux, puis répétez"${all[@]}"
.Il est également possible de l'utiliser
eval
, mais le code résultant est incroyablement horrible.Voir la réponse de glenn jackman pour une variation avec indirection variable (introduite dans sa forme actuelle avec Bash version 2).
la source
@Kusalananda a la meilleure réponse pour les versions récentes de bash. Pour les versions antérieures, vous pouvez utiliser une variable indirecte:
Voir le 4ème paragraphe de https://www.gnu.org/software/bash/manual/bashref.html#Shell-Parameter-Expansion
la source
En variante de ce qui a été dit:
Accéder aux éléments par index à la place
la source