Sto cercando di scrivere un ciclo annidato e non capisco come scriverlo. Forse sto guardando in una direzione sbagliata ma quello che sto cercando di scrivere è:
declare -a bar=("alpha" "bravo" "charlie")
declare -a foo=("delta" "echo" "foxtrot" "golf")
declare -a subgroups=("bar" "foo")
Quindi vorrei iterare i sottogruppi (in futuro più bar se foo s arriveranno), e al loro interno, iterarli in quanto possono avere un numero diverso di elementi.
L'output desiderato sarebbe qualcosa del tipo:
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
Il codice di chiusura che ho scritto sembra non riuscire nella bar e pippo array e la sua espansione con gli elementi su ogni set.
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
E l'output è:
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
Risposta accettata:
Questo è un problema abbastanza comune in bash
, per fare riferimento all'array all'interno di array per i quali è necessario creare riferimenti al nome con declare -n
. Il nome che segue il -n
fungerà da nameref al valore assegnato (dopo =
). Ora trattiamo questa variabile con l'attributo nameref in modo che si espanda come se fosse un array ed eseguiamo un'espansione completa dell'array tra virgolette come prima.
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
Nota che bash
supporta solo i nameref dalla v4.3 in poi. Per le versioni precedenti e altre soluzioni alternative, vedere Assegnazione di variabili indirette/di riferimento