Ich versuche, eine verschachtelte Schleife zu schreiben, und ich verstehe nicht, wie ich sie schreiben soll. Vielleicht schaue ich in die falsche Richtung, aber was ich versuche zu schreiben, ist:
declare -a bar=("alpha" "bravo" "charlie")
declare -a foo=("delta" "echo" "foxtrot" "golf")
declare -a subgroups=("bar" "foo")
Dann würde ich gerne die Untergruppen iterieren (in Zukunft mehr bar s und foo s kommen), und in ihnen iterieren, da sie eine unterschiedliche Anzahl von Elementen haben können.
Die gewünschte Ausgabe wäre so etwas wie:
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
Der Schließcode, den ich geschrieben habe, scheint in der Leiste fehlzuschlagen und foo Arrays und ihre Erweiterung mit den Elementen auf jedem 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
Und die Ausgabe ist:
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
Akzeptierte Antwort:
Dies ist ein ziemlich häufiges Problem in bash
, um ein Array innerhalb von Arrays zu referenzieren, für die Sie Namensreferenzen mit declare -n
erstellen müssen . Der Name nach dem -n
fungiert als Nameref für den zugewiesenen Wert (nach =
). Jetzt behandeln wir diese Variable mit dem Attribut nameref, um sie so zu erweitern, als ob sie ein Array wäre, und führen wie zuvor eine vollständige Erweiterung des Arrays in Anführungszeichen durch.
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
Beachten Sie, dass bash
unterstützt nur Namerefs ab v4.3. Für ältere Versionen und andere Problemumgehungen siehe Indirekte Variablen/Referenzvariablen zuweisen