ใหม่;&
และ;;&
ผู้ประกอบการได้รับการแนะนำในBash
4.0
และแม้ว่าพวกเขาทั้งสองอาจมีประโยชน์ในสถานการณ์ที่คล้ายกันฉันคิดว่าพวกเขาจะไม่ใช้ในกรณีของคุณ นี่คือสิ่งที่man bash
พูดเกี่ยวกับตัวดำเนินการเหล่านี้:
ถ้า; มีการใช้โอเปอเรเตอร์จะไม่พยายามทำการจับคู่ในภายหลังหลังจากการจับคู่รูปแบบครั้งแรก ใช้; & ในสถานที่ของ ;; ทำให้การดำเนินการเพื่อดำเนินการต่อกับรายการที่เกี่ยวข้องกับชุดรูปแบบถัดไป ใช้ ;; & แทนที่ ;; ทำให้เชลล์ทดสอบรายการรูปแบบถัดไปในคำสั่งถ้ามีและดำเนินการรายการที่เกี่ยวข้องใด ๆ ในการจับคู่ที่ประสบความสำเร็จ
กล่าวอีกนัยหนึ่ง;&
คือความล้มเหลวและเรารู้ได้จากC
และ
;;&
ทำให้bash
ตรวจสอบกรณีที่เหลือแทนที่จะกลับมาจาก
case
บล็อกทั้งหมด คุณสามารถค้นหาเป็นตัวอย่างที่ดีของการ;;&
ในการดำเนินการที่นี่: /programming//a/24544780/3691891
ที่ถูกกล่าวว่าไม่;&
ว่ามิได้;;&
สามารถนำมาใช้ในสคริปต์ของคุณเพราะทั้งสองของพวกเขาจะไป*)
ที่จะถูกเรียกใช้เสมอ
สคริปต์ต่อไปนี้ทำงานและทำสิ่งที่คุณต้องการโดยไม่ต้องจัดเรียงตรรกะใหม่ แต่พิจารณาว่าเป็นเพียงตัวอย่างเท่านั้นและไม่เคยพึ่งพามันมันบอบบางเกินไป ฉันได้รับแนวคิดจาก
ที่นี่ :
#!/usr/bin/env bash
function jumpto
{
label=$1
cmd=$(sed -n "/$label:/{:a;n;p;ba};" "$0" | grep -v ':$')
cmd=$(echo "$cmd" | sed 's,;;,,')
cmd=$(echo "$cmd" | sed 's,esac,,')
eval "$cmd"
}
input="foo"
VAR="1"
case $input in
foo)
if [ $VAR = "1" ]; then
printf "perform fallthrough\n"
jumpto ft
else
printf "do not perform fallthrough\n"
fi
;;
*)
ft:
echo "fallthrough worked!"
;;
esac
if [ $VAR -eq 1 ]; then
ส่วนหนึ่งของรหัสไปยังสิ่งที่อยู่ใน*)
? เพราะมันแตกต่างอย่างสิ้นเชิงกับสิ่งที่เรียกว่าการตกหล่นดังนั้นการสร้างประโยคคำถามของคุณจะทำให้เข้าใจผิดเล็กน้อย