Off pertama, Anda tidak perlu menggunakan $(echo $FRUITS)
dalam for
pernyataan. Menggunakan keadilan saja $FRUITS
sudah cukup. Kemudian Anda bisa menghilangkan salah satu garis di dalam loop, dengan menggunakan eval
.
The eval
hanya memberitahu bash untuk membuat kedua evaluasi dari pernyataan berikut (yaitu satu lebih dari evaluasi normal). Yang \$
bertahan evaluasi pertama sebagai $
, dan evaluasi berikutnya kemudian memperlakukan ini $
sebagai awal nama variabel, yang memutuskan untuk "Kuning", dll.
Dengan cara ini Anda tidak perlu memiliki langkah terpisah yang membuat string sementara (yang menurut saya adalah tujuan utama pertanyaan Anda).
for fruit in $FRUITS ;do
eval echo $fruit is \$${fruit}_COLOUR
done
Untuk metode alternatif, seperti yang disebutkan oleh Patrick dalam komentar (di atas), Anda bisa menggunakan array asosiatif , di mana indeks elemen tidak perlu bilangan bulat. Anda dapat menggunakan string, seperti nama jenis buah. Berikut ini contohnya, menggunakan array asosiatif bash:
# 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
!
sintaks adalah bendera pada substitusi variabel yang pada dasarnya mengatakan “pengganti dua kali”. Itu tidak mengubah persyaratan bahwa apa yang ada di dalamnya${…}
harus berupa nama variabel. Jadi tidak, Anda tidak dapat menghindari menggunakan variabel yang berisi nama, kecuali jika Anda menggunakan metode yang berbeda (eval
).