ผู้ประกอบการ&&ดำเนินการคำสั่งถัดไปหากคำสั่งก่อนหน้ามีการดำเนินการที่ประสบความสำเร็จ (ส่งคืนรหัสออก ($?) 0 = ตรรกะจริง)
ในรูปแบบA && B || C
คำสั่ง (หรือเงื่อนไข) Aได้รับการประเมินและหากAคืนค่าจริง (สำเร็จให้ออกรหัส 0) จากนั้นคำสั่งBจะถูกดำเนินการ ถ้าAล้มเหลว (ดังนั้นจะส่งคืนfalse - exit code นอกเหนือจาก 0) และ / หรือBล้มเหลว ( return false ) ดังนั้นคำสั่งCจะถูกดำเนินการ
&&
ตัวดำเนินการยังถูกใช้เป็นANDในการตรวจสอบเงื่อนไขและตัวดำเนินการ||
ทำงานเช่นORในการตรวจสอบเงื่อนไข
ทั้งนี้ขึ้นอยู่กับสิ่งที่คุณต้องการจะทำอย่างไรกับสคริปต์ของคุณในรูปแบบA && B || C
ที่สามารถใช้สำหรับการตรวจสอบสภาพเหมือนตัวอย่างของคุณหรือสามารถใช้คำสั่งโซ่และให้แน่ใจว่าชุดของคำสั่งที่จะดำเนินการถ้าคำสั่งก่อนหน้านี้มีรหัสทางออกที่ประสบความสำเร็จ0 นี่คือเหตุผลที่มันเป็นเรื่องธรรมดาที่จะเห็นคำสั่งเช่น:
do_something && do_something_else_that_depended_on_something
ตัวอย่าง:
apt-get update && apt-get upgrade
หากการอัปเดตล้มเหลวการอัปเกรดจะไม่ดำเนินการ (สมเหตุสมผลในโลกแห่งความเป็นจริง ... )
mkdir test && echo "Something" > test/file
ส่วนที่echo "Something"
จะดำเนินการเฉพาะในกรณีที่mkdir test
ประสบความสำเร็จและการดำเนินงานกลับรหัสออกจาก0
./configure --prefix=/usr && make && sudo make install
มักจะพบในการรวบรวมงานเพื่อเชื่อมโยงคำสั่งที่ขึ้นอยู่กับความจำเป็นเข้าด้วยกัน
หากคุณพยายามที่จะใช้ "โซ่" ข้างต้นด้วยถ้า - แล้ว - อื่น ๆคุณจะต้องใช้คำสั่งและการตรวจสอบมากขึ้น (และทำให้โค้ดมากขึ้นในการเขียน - สิ่งอื่น ๆ ที่ผิดพลาด) สำหรับงานง่าย
นอกจากนี้โปรดทราบว่าคำสั่งที่ผูกมัดด้วย&&และ|| ถูกอ่านโดยเชลล์จากซ้ายไปขวา คุณอาจต้องจัดกลุ่มคำสั่งและตรวจสอบเงื่อนไขด้วยเครื่องหมายวงเล็บเพื่อขึ้นอยู่กับขั้นตอนถัดไปของเอาต์พุตที่สำเร็จของคำสั่งก่อนหน้าบางคำสั่ง ตัวอย่างเช่นดูนี้:
root@debian:$ true || true && false;echo $?
1
#read from left to right
#true OR true=true AND false = false = exit code 1=not success
root@debian:$ true || (true && false);echo $?
0
# true OR (true AND false)=true OR false = true = exit code 0 = success
หรือตัวอย่างชีวิตจริง:
root@debian:$ a=1;b=1;c=1;[[ $a -eq 1 ]] || [[ $b -eq 1 ]] && [[ $c -eq 2 ]];echo $?
1
#condition $a = true OR condition b = true AND condition $c = false
#=> yields false as read from left to right, thus exit code=1 = not ok
root@debian:$ a=1;b=1;c=1;[[ $a -eq 1 ]] || [[ $b -eq 1 && $c -eq 2 ]];echo $?
0
#vars b and c are checked in a group which returns false,
#condition check of var a returns true, thus true OR false yields true = exit code 0
โปรดทราบว่าคำสั่งบางคำสั่งจะส่งคืนรหัสทางออกที่แตกต่างกันขึ้นอยู่กับกระบวนการที่ดำเนินการหรือส่งคืนรหัสที่แตกต่างกันขึ้นอยู่กับการกระทำของพวกเขา (เช่นคำสั่ง GNU diff
ส่งคืน1หากไฟล์สองไฟล์แตกต่างกันและ0หากไม่มี) คำสั่งดังกล่าวจะต้องได้รับการปฏิบัติด้วยความระมัดระวังใน&&และ|| .
นอกจากนี้เพื่อให้ไขปริศนาทั้งหมดเข้าด้วยกันให้คำนึงถึงการรวมคำสั่งเข้าด้วยกันโดยใช้;
โอเปอเรเตอร์ ด้วยรูปแบบA;B;C
คำสั่งทั้งหมดจะถูกดำเนินการในซีรีส์ไม่ว่าสิ่งที่เป็นรหัสทางออกของคำสั่งและA
B