เทคนิคคลาสสิก (Escape metacharacters):
if [ \( "$g" -eq 1 -a "$c" = "123" \) -o \( "$g" -eq 2 -a "$c" = "456" \) ]
then echo abc
else echo efg
fi
ฉันได้ใส่การอ้างอิงไว้$g
ในเครื่องหมายคำพูดคู่ เป็นการปฏิบัติที่ดีโดยทั่วไป อย่างเคร่งครัดวงเล็บไม่จำเป็นเพราะความสำคัญของ-a
และ-o
ทำให้มันถูกต้องแม้ไม่มีพวกเขา
หมายเหตุว่า-a
และ-o
ผู้ประกอบการเป็นส่วนหนึ่งของข้อกำหนด POSIX สำหรับtest
อาคา[
ส่วนใหญ่สำหรับการทำงานร่วมกันหลัง (ตั้งแต่พวกเขาเป็นส่วนหนึ่งของtest
ในรุ่นที่ 7 UNIX เป็นต้น) แต่พวกเขามีการทำเครื่องหมายอย่างชัดเจนว่า 'หมดโดย POSIX Bash (ดูนิพจน์แบบมีเงื่อนไข ) ดูเหมือนว่าจะ preempt ความหมายแบบคลาสสิคและ POSIX สำหรับ-a
และ-o
ด้วยตัวดำเนินการทางเลือกของตัวเองที่รับอาร์กิวเมนต์
ด้วยความระมัดระวังคุณสามารถใช้[[
โอเปอเรเตอร์ที่ทันสมัยกว่าได้ แต่ระวังว่าเวอร์ชั่นใน Bash และ Korn Shell (ตัวอย่าง) ไม่จำเป็นต้องเหมือนกัน
for g in 1 2 3
do
for c in 123 456 789
do
if [[ ( "$g" -eq 1 && "$c" = "123" ) || ( "$g" -eq 2 && "$c" = "456" ) ]]
then echo "g = $g; c = $c; true"
else echo "g = $g; c = $c; false"
fi
done
done
ตัวอย่างการรันโดยใช้ Bash 3.2.57 บน Mac OS X:
g = 1; c = 123; true
g = 1; c = 456; false
g = 1; c = 789; false
g = 2; c = 123; false
g = 2; c = 456; true
g = 2; c = 789; false
g = 3; c = 123; false
g = 3; c = 456; false
g = 3; c = 789; false
คุณไม่จำเป็นต้องพูดตัวแปรในแบบ[[
เดียวกับที่คุณทำ[
เพราะมันไม่ใช่คำสั่งที่แยกกันในแบบเดียวกับที่[
เป็น
นี่ไม่ใช่คำถามคลาสสิกใช่ไหม
ฉันจะมีความคิดเช่นนั้น. อย่างไรก็ตามมีทางเลือกอื่นคือ:
if [ "$g" -eq 1 -a "$c" = "123" ] || [ "$g" -eq 2 -a "$c" = "456" ]
then echo abc
else echo efg
fi
แน่นอนถ้าคุณอ่านคำแนะนำ 'พกพาเชลล์' สำหรับautoconf
เครื่องมือหรือแพ็คเกจที่เกี่ยวข้องสัญลักษณ์นี้ - โดยใช้ ' ||
' และ ' &&
' - เป็นสิ่งที่พวกเขาแนะนำ ฉันคิดว่าคุณสามารถไปได้ไกลถึง:
if [ "$g" -eq 1 ] && [ "$c" = "123" ]
then echo abc
elif [ "$g" -eq 2 ] && [ "$c" = "456" ]
then echo abc
else echo efg
fi
ในกรณีที่การกระทำนั้นไม่สำคัญเท่ากับการสะท้อนสิ่งนี้ก็ไม่เลว เมื่อบล็อกการดำเนินการที่ต้องทำซ้ำเป็นหลายบรรทัดการทำซ้ำนั้นเจ็บปวดเกินไปและหนึ่งในเวอร์ชันก่อนหน้านั้นเป็นที่นิยมมากกว่าหรือคุณต้องใส่การกระทำลงในฟังก์ชันที่เรียกใช้ในthen
บล็อกที่แตกต่างกัน
test
([
) และไม่ใช่โดยเชลล์[
เปลือกประเมินเพียงแค่ออกจากสถานะของ