ฉันพยายามที่จะใช้ตัวแปรประกอบด้วยสตริงที่แตกต่างกันแยกออกจากกันด้วยความ|เป็นcaseทดสอบคำสั่ง ตัวอย่างเช่น:
string="\"foo\"|\"bar\""
read choice
case $choice in
$string)
echo "You chose $choice";;
*)
echo "Bad choice!";;
esac
ฉันต้องการที่จะพิมพ์fooหรือbarดำเนินการส่วนแรกของcaseคำสั่ง อย่างไรก็ตามทั้งสองfooและbarพาฉันไปที่สอง:
$ foo.sh
foo
Bad choice!
$ foo.sh
bar
Bad choice!
ใช้"$string"แทน$stringทำให้ไม่มีความแตกต่าง string="foo|bar"ไม่ไม่ใช้
ฉันรู้ว่าฉันสามารถทำได้ด้วยวิธีนี้:
case $choice in
"foo"|"bar")
echo "You chose $choice";;
*)
echo "Bad choice!";;
esac
ฉันสามารถคิดถึงวิธีแก้ปัญหาต่าง ๆ แต่ฉันต้องการทราบว่าเป็นไปได้ที่จะใช้ตัวแปรเป็นcaseเงื่อนไขในการทุบตี เป็นไปได้และถ้าเป็นเช่นนั้นได้อย่างไร
readบิตก็หยุดฉัน ในความเห็นของฉันการตรวจสอบการป้อนข้อมูลของผู้ใช้ซึ่งเป็นสิ่งที่ดูเหมือนว่าจะเป็นcaseรูปแบบไม่ควรอยู่ด้านบนของรายการการประเมินผลและควรถูกตัดให้เป็น*รูปแบบเริ่มต้นแทนที่จะรับประกันผลลัพธ์เท่านั้นที่ยอมรับได้ ยังเพราะปัญหาคือการแยก / คำสั่งขยายแล้วการประเมินผลที่สองอาจเป็นสิ่งที่เรียกร้องให้
evalหลีกเลี่ยง $ choice, parens, asterisk, semicolons และ newlines น่าเกลียด แต่มัน "ได้ผล"