GNU/Linux >> Linux Esercitazione >  >> Linux

Bash array di array?

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

Correlati:come usare bash come shell predefinita?
Linux
  1. Parentesi singola nell'assegnazione delle variabili Bash?

  2. Rsync ~/foo Target/foo è uguale a Rsync ~/foo/ Target/foo/?

  3. Matrici Bash con esempi

  4. Il tutorial Ultimate Bash Array con 15 esempi

  5. Array in Bash non trovato

Matrici Bash

Matrice associativa in Bash

Bash Scripting – Array associativo spiegato con esempi

Bash Beginner Series #4:Utilizzo di array in Bash

convertire l'output di bash `ls` in un array json

Converti una stringa di testo in bash in array