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