GNU/Linux >> Znalost Linux >  >> Linux

Bash Array Of Arrays?

Snažím se napsat nějakou vnořenou smyčku a nevím, jak to napsat. Možná se dívám špatným směrem, ale to, co se snažím napsat, je:

declare -a bar=("alpha" "bravo" "charlie")
declare -a foo=("delta" "echo" "foxtrot" "golf")

declare -a subgroups=("bar" "foo")

Takže bych chtěl iterovat podskupiny (v budoucnu více bar s a foo s přijde) a uvnitř je iterujte, protože mohou mít různý počet prvků.

Požadovaný výstup by byl něco jako:

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

Zdá se, že uzavírací kód, který jsem napsal, selhal na liště a foo pole a jeho rozšíření o prvky na každé sadě.

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

A výstup je:

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

Přijatá odpověď:

Toto je docela běžný problém v bash , k odkazování na pole v polích, pro která potřebujete vytvořit jmenné odkazy pomocí declare -n . Název následující za -n bude fungovat jako nameref k přiřazené hodnotě (za = ). Nyní zacházíme s touto proměnnou s atributem nameref, aby se rozšířila, jako by to bylo pole, a provedeme úplnou správnou expanzi pole v uvozovkách jako dříve.

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

Všimněte si, že bash podporuje nameref pouze od verze 4.3 výše. Starší verze a další řešení viz Přiřazení nepřímých/referenčních proměnných

Související:Jak používat bash jako výchozí shell?
Linux
  1. Jednoduchá závorka v přiřazení proměnné Bash?

  2. Je Rsync ~/foo Target/foo stejný jako Rsync ~/foo/ Target/foo/?

  3. Pole AWK vysvětleno na 5 praktických příkladech

  1. Bash zachycující výstup awk do pole

  2. Jak deklarovat 2D pole v bash

  3. Převeďte textový řetězec v bash na pole

  1. Bash pole s příklady

  2. Výukový program Ultimate Bash Array s 15 příklady

  3. Pole v Bash nenalezeno