GNU/Linux >> Belajar Linux >  >> Linux

Bash Array Dari Array?

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

Terkait:Bagaimana cara menggunakan bash sebagai shell default?
Linux
  1. Bagaimana Cara Membuat Array Elemen Unik Dari String/array Di Bash?

  2. Kurung Tunggal Dalam Penugasan Variabel Bash?

  3. Apakah Rsync ~/foo Target/foo Sama Dengan Rsync ~/foo/ Target/foo/?

  1. Dapatkan Semua File Tapi File Dalam Array – Bash?

  2. Tutorial Bash Array Terbaik dengan 15 Contoh

  3. Array di Bash Tidak Ditemukan

  1. konversi keluaran bash `ls` ke array json

  2. Konversikan string teks dalam bash ke array

  3. Cara mengatur waktu sekelompok perintah di Bash