J'essaie d'écrire une boucle imbriquée, et je ne comprends pas comment l'écrire. Peut-être que je regarde dans la mauvaise direction, mais ce que j'essaie d'écrire, c'est :
declare -a bar=("alpha" "bravo" "charlie")
declare -a foo=("delta" "echo" "foxtrot" "golf")
declare -a subgroups=("bar" "foo")
Alors je voudrais itérer les sous-groupes (à l'avenir plus bar s et foo s viendront), et à l'intérieur d'eux, itérez-les car ils peuvent avoir un nombre différent d'éléments.
La sortie souhaitée serait quelque chose comme :
group name: bar with group members: alpha bravo charlie
working on alpha of the bar group
working on bravo of the bar group
working on charlie of the bar group
group name: foo with group members: delta echo foxtrot golf
working on delta of the foo group
working on echo of the foo group
working on foxtrot of the foo group
working on golf of the foo group
Le code de fermeture que j'ai écrit semble échouer dans la bar et foo tableaux et son expansion avec les éléments de chaque ensemble.
for group in "${subgroups[@]}"; do
lst=${!group}
echo "group name: ${group} with group members: ${!lst[@]}"
for element in "${!lst[@]}"; do
echo -en "\tworking on $element of the $group group\n"
done
done
Et le résultat est :
group name: bar with group members: 0
working on 0 of the bar group
group name: foo with group members: 0
working on 0 of the foo group
Réponse acceptée :
C'est un problème assez courant dans bash
, pour référencer un tableau dans des tableaux pour lesquels vous devez créer des références de nom avec declare -n
. Le nom suivant le -n
agira comme un nameref à la valeur assignée (après =
). Maintenant, nous traitons cette variable avec l'attribut nameref pour qu'elle se développe comme s'il s'agissait d'un tableau et procédons à une expansion complète du tableau entre guillemets comme auparavant.
for group in "${subgroups[@]}"; do
declare -n lst="$group"
echo "group name: ${group} with group members: ${lst[@]}"
for element in "${lst[@]}"; do
echo -en "\tworking on $element of the $group group\n"
done
done
Notez que bash
prend en charge les nameref à partir de la v4.3 uniquement. Pour les anciennes versions et autres solutions de contournement, voir Affectation de variables indirectes/de référence