Bu çok fazla deneme yanılma aldı ancak sonunda işe yaradı.
Youness'ten biraz ilham aldım. Ama diğer tüm cevaplar benim eski bash yardımcı olmadı (suse11sp1 [3.2.51 (1) -çalışma])
'For' döngüsü dolaylı diziyi genişletmeyi reddetti, bunun yerine önceden genişletmeniz gerekiyor, bunu yeni değişken adınızla başka bir dizi oluşturmak için kullanın. Aşağıdaki örneğim, amaçladığım kullanım olduğu için bir çift döngü gösteriyor.
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
Ben ilk dizi girişinden "New_" silmek, sonra "FOOthings" almak için "şeyler" ile birleştirmek için # kullanıyorum. yankı ve eval ile \ $ {}, sonra yeni bir $ () sarılmış ve yeni değişken adı atanan hata atmadan sırayla şeylerini yapmak.
$ 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
GÜNCELLEME ##### 2018/06/07
Geçenlerde bu konuda bir spin daha keşfettim. Oluşturulan değişken aslında bir dizi değil, boşlukla ayrılmış bir dizedir. Yukarıdaki görev için bu tamam, çünkü "için" nasıl çalışır, dizi okumuyor, genişletilir ve sonra döngü, aşağıdaki özü bakın:
for VARIABLE in 1 2 3 4 5 .. N
do
command1
command2
commandN
done
Ama sonra bir dizi olarak kullanmak gerekiyordu. Bunun için bir adım daha atmam gerekiyordu. Dennis Williamson tarafından kod kelimesini kelimesine aldım . Test ettim ve iyi çalışıyor.
IFS=', ' read -r -a TheNewVariable <<< ${TheNewVariable[@]}
"IFS = ','", sınırlayıcınızı içeren bir değişkendir. "read" ile "read", sokmayı dizi değişkenine geri keser ve besler. Bu tırnak işaretleri için bir saygı vardır, ancak bunu yönetmek için okuma birkaç seçenek vardır , örneğin ben ihtiyacım olmayan -r bayrağı kaldırdım. Şimdi bu eklemeyi, verilerin olması gerektiği gibi ele alınmasını ve ele alınmasını sağlayan değişken oluşturmada birleştirdim.
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