ก่อนอื่นคุณไม่จำเป็นต้องใช้$(echo $FRUITS)
ในfor
คำสั่ง ใช้แค่ $FRUITS
พอ eval
จากนั้นคุณสามารถทำไปด้วยหนึ่งในสายภายในวงโดยใช้
eval
เพียงแค่บอกทุบตีเพื่อให้เป็นครั้งที่สองการประเมินผลของคำสั่งดังต่อไปนี้ (คือหนึ่งมากกว่าการประเมินผลตามปกติ) การ\$
มีชีวิตรอดของการประเมินครั้งแรกเป็น$
และการประเมินผลครั้งต่อไปจะถือว่าสิ่งนี้$
เป็นจุดเริ่มต้นของชื่อตัวแปรซึ่งจะเปลี่ยนเป็น "สีเหลือง" เป็นต้น
วิธีนี้คุณไม่จำเป็นต้องมีขั้นตอนแยกต่างหากซึ่งสร้างสตริงชั่วคราว (ซึ่งเป็นสิ่งที่ฉันเชื่อว่าเป็นเจตนาหลักของคำถามของคุณ)
for fruit in $FRUITS ;do
eval echo $fruit is \$${fruit}_COLOUR
done
สำหรับวิธีทางเลือกดังที่Patrickกล่าวไว้ในความคิดเห็น (ด้านบน) คุณสามารถใช้อาเรย์แบบเชื่อมโยงซึ่งดัชนีขององค์ประกอบไม่จำเป็นต้องเป็นจำนวนเต็ม คุณสามารถใช้สตริงเช่นชื่อประเภทผลไม้ นี่คือตัวอย่างการใช้อาเรย์แบบเชื่อมโยงของ 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
!
ไวยากรณ์ธงแทนค่าตัวแปรนั้นโดยทั่วไปว่า“แทนครั้งที่สองว่า” มันไม่เปลี่ยนความต้องการที่สิ่งที่อยู่ภายใน${…}
จะต้องเป็นชื่อตัวแปร ดังนั้นไม่คุณไม่สามารถหลีกเลี่ยงการใช้ตัวแปรที่มีชื่อได้เว้นแต่คุณจะใช้วิธีการอื่น (eval
)