GNU/Linux >> Tutoriels Linux >  >> Linux

Bash tableau de tableaux?

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

Connexe :Comment utiliser bash comme shell par défaut ?
Linux
  1. Comment créer un tableau d'éléments uniques à partir d'une chaîne/tableau dans Bash ?

  2. Est-ce que Rsync ~/foo Target/foo est identique à Rsync ~/foo/ Target/foo/?

  3. Le tutoriel Ultimate Bash Array avec 15 exemples

  4. Tableau dans Bash introuvable

  5. convertir la sortie bash `ls` en tableau json

Tableaux bash

Tableau associatif dans Bash

Bash Scripting - Tableau associatif expliqué avec des exemples

Parenthèse unique dans l'affectation de variables Bash ?

Obtenir tous les fichiers sauf les fichiers du tableau - Bash ?

Bash Beginner Series #4 :Utiliser des tableaux dans Bash