Öncelikle $(echo $FRUITS)
, for
ifadede kullanmanıza gerek yok . Sadece kullanmak $FRUITS
yeterlidir. Sonra kullanarak, döngü içindeki çizgilerden birini ortadan kaldırabilirsiniz eval
.
eval
Basitçe ikinci olmak için Bash söyler değerlendirmeyi aşağıdaki ifadenin (yani bir tane daha normal değerlendirilmesi yerine). \$
İlk değerlendirmeyi hayatta $
ve sonraki değerlendirme o zaman bu davranır $
"Sarı" vb hangi giderir bir değişken adı başlangıcı olarak
Bu şekilde, geçici bir dize oluşturan ayrı bir adımınız olması gerekmez (bu, sorunuzun ana amacı olduğuna inanıyorum).
for fruit in $FRUITS ;do
eval echo $fruit is \$${fruit}_COLOUR
done
Bir yorumda (yukarıda) Patrick tarafından belirtildiği gibi alternatif bir yöntem için, bunun yerine bir öğenin dizininin bir tamsayı olması gerekmeyen ilişkilendirilebilir bir dizi kullanabilirsiniz . Bir meyve türünün adı gibi bir dize kullanabilirsiniz. İşte bash ilişkisel dizisini kullanan bir örnek:
# This declares an associative array (It unsets it if it already exists)
declare -A colour
colour['BANANA']="Yellow"
colour["APPLE"]="Green or Red"
colour[MARTIAN ORANGE]="Blue"
for fruit in BANANA APPLE "MARTIAN ORANGE" ;do
echo "$fruit" is "${colour[$fruit]}"
done
!
Sözdizimi temelde “iki kez yerine” diyor değişken değişimi üzerine bir bayraktır. İçindekilerin${…}
değişken bir isim olması gerekliliğini değiştirmez . Bu nedenle, farklı bir yöntem (eval
) kullanmazsanız, adı içeren bir değişken kullanmaktan kaçınamazsınız .