Saya ingin menulis skrip untuk referensi beberapa array dari array lain yang menyimpan nama-nama variabel array ini.
Inilah kode saya sejauh ini:
#!/bin/bash
array1=('array1string1' 'array1string2')
array2=('array2string1' 'array2string2')
array_names=('array1' 'array2')
for a in ${array_names[@]}
do
for b in ${a[@]}
do
echo $b
done
done
Saya ingin output memindai kedua array (dari luar untuk loop) dan mencetak masing-masing string di dalam untuk loop yang memanggil gema. Output saya saat ini hanya menunjukkan kepada saya:
array1
array2
Saya akan berterima kasih atas petunjuk tentang hal ini. Terima kasih!
bash
shell-script
chnppp
sumber
sumber
for b in "${array1[@]}" "${array2[@]}"; do ...; done
?${a[@]}
untuk${!a}
melakukan apa yang Anda inginkan (saya pikir).${!a[@]}
memberikan panjang arraya
.${!a}
hanya memberi saya elemen pertama.Jawaban:
Bash 4.3 dan yang lebih baru mendukung "referensi nama", atau nameref (ada konsep yang serupa
ksh93
, tetapi pelingkupannya sangat berbeda ):Variabel
arr
adalah nameref yang bertindak seperti alias untuk variabel bernama (variabel dengan nama$a
dalam contoh ini).Tanpa namerefs, di versi Bash sebelumnya, salah satu solusinya adalah membuat array baru yang berisi semua elemen dari array lain:
... sedikit seperti
array_names
array dalam pertanyaan tetapi dengan isi semua array, dan kemudian beralih"${all[@]}"
.Itu juga mungkin untuk digunakan
eval
, tetapi kode yang dihasilkan tampak sangat mengerikan.Lihat jawaban glenn jackman untuk variasi dengan tipuan variabel (diperkenalkan dalam bentuk saat ini dengan Bash versi 2).
sumber
@ Kusalananda memiliki jawaban terbaik untuk versi bash terbaru. Untuk versi sebelumnya, Anda dapat menggunakan variabel tidak langsung:
Lihat paragraf ke-4 https://www.gnu.org/software/bash/manual/bashref.html#Shell-Parameter-Expansion
sumber
Sebagai variasi dari apa yang dikatakan:
Mengakses elemen dengan indeks sebagai gantinya
sumber