Ini membutuhkan banyak trial and error tetapi akhirnya berhasil.
Saya mengambil beberapa inspirasi dari Youness. Tetapi semua jawaban lain tidak membantu bash lama saya (suse11sp1 [3.2.51 (1) -release])
Loop 'untuk' menolak untuk memperluas array tidak langsung, sebagai gantinya Anda perlu melakukan pra-perluasannya, menggunakannya untuk membuat array lain dengan nama variabel baru Anda. Contoh saya di bawah ini menunjukkan loop ganda, karena itulah tujuan saya.
THEBIGLOOP=(New_FOO New_BAR)
FOOthings=(1 2 3)
BARthings=(a b c)
for j in ${THEBIGLOOP[*]}
do
TheNewVariable=$(eval echo \${${j#New_}things[@]})
for i in $TheNewVariable
do
echo $j $i" hello"
echo
done
done
Saya menggunakan # untuk menghapus "New_" dari entri array pertama, kemudian menyatukan dengan "sesuatu", untuk mendapatkan "FOOthings". \ $ {} dengan gema dan eval, kemudian lakukan tugas mereka tanpa membuang kesalahan, yang dibungkus dengan $ (baru) dan ditugaskan nama variabel baru.
$ Test.sh
New_FOO 1 hello
New_FOO 2 hello
New_FOO 3 hello
New_BAR a hello
New_BAR b hello
New_BAR c hello
UPDATE ##### 2018/06/07
Saya baru-baru ini menemukan satu putaran lagi tentang masalah ini. Variabel yang dibuat sebenarnya bukan array, tetapi string yang dibatasi ruang. Untuk tugas di atas ini ok, karena bagaimana "untuk" bekerja, tidak membaca array, diperluas dan kemudian diulang, lihat ekstrak di bawah ini:
for VARIABLE in 1 2 3 4 5 .. N
do
command1
command2
commandN
done
Tapi, saya kemudian perlu menggunakannya sebagai array. Untuk ini saya perlu melakukan satu langkah lagi. Saya mengambil kode kata demi kata oleh Dennis Williamson . Saya sudah mengujinya dan berfungsi dengan baik.
IFS=', ' read -r -a TheNewVariable <<< ${TheNewVariable[@]}
"IFS = ','" adalah variabel yang mengandung pembatas Anda. "baca" dengan "-a" memotong dan memasukkan sengatan kembali ke variabel array. Catatan, ini tidak menghormati tanda kutip, tetapi ada beberapa opsi dalam membaca untuk mengelola ini, misalnya saya telah menghapus tanda -r yang tidak saya butuhkan. Jadi saya sekarang telah menggabungkan penambahan ini dalam pembuatan variabel, yang memungkinkan data untuk diperlakukan dan ditangani sebagaimana mestinya.
THEBIGLOOP=(New_FOO New_BAR)
FOOthings=(1 2 3)
BARthings=(a b c)
for j in ${THEBIGLOOP[*]}
do
IFS=', ' read -a TheNewVariable <<< $(eval echo \${${j#New_}things[@]})
for i in ${TheNewVariable[@]} #Now have to wrap with {} and expand with @
do
echo $j $i" hello"
echo ${TheNewVariable[$i]} #This would not work in the original code
echo
done
done