Mencoba menulis beberapa loop bersarang, dan saya tidak mengerti cara menulisnya. Mungkin saya melihat ke arah yang salah tetapi apa yang saya coba tulis adalah:
declare -a bar=("alpha" "bravo" "charlie")
declare -a foo=("delta" "echo" "foxtrot" "golf")
declare -a subgroups=("bar" "foo")
Jadi saya ingin mengulangi subgrup (di masa mendatang lebih banyak bar s dan foo s akan datang), dan di dalamnya ulangi karena mereka dapat memiliki jumlah elemen yang berbeda.
Output yang diinginkan akan menjadi seperti:
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
Kode penutupan yang saya tulis sepertinya gagal di bar dan foo array dan perluasannya dengan elemen pada setiap 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
Dan hasilnya adalah:
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
Jawaban yang Diterima:
Ini adalah masalah yang cukup umum di bash
, untuk mereferensikan larik di dalam larik yang Anda perlukan untuk membuat referensi nama dengan declare -n
. Nama mengikuti -n
akan bertindak sebagai nameref ke nilai yang ditetapkan (setelah =
). Sekarang kita memperlakukan variabel ini dengan atribut nameref untuk memperluas seolah-olah itu adalah sebuah array dan melakukan ekspansi array yang dikutip dengan benar seperti sebelumnya.
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
Perhatikan bahwa bash
hanya mendukung nameref dari v4.3 dan seterusnya. Untuk versi yang lebih lama dan solusi lainnya, lihat Menetapkan variabel tidak langsung/referensi