GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Bash-Array von Arrays?

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

Verwandte:Wie verwende ich Bash als Standard-Shell?
Linux
  1. Wie erstelle ich ein Array eindeutiger Elemente aus einer Zeichenfolge/einem Array in Bash?

  2. Ist Rsync ~/foo Target/foo dasselbe wie Rsync ~/foo/Target/foo/?

  3. Bash-Arrays mit Beispielen

  4. AWK-Arrays erklärt mit 5 praktischen Beispielen

  5. Array in Bash nicht gefunden

Bash-Arrays

Assoziatives Array in Bash

Bash-Scripting – Assoziatives Array mit Beispielen erklärt

Einzelne Klammer in der Bash-Variablenzuweisung?

Alle Dateien außer den Dateien im Array abrufen – Bash?

Bash-Anfängerserie Nr. 4:Verwenden von Arrays in Bash