เหตุผลในการใช้ && แทนคืออะไร; จะวางคำสั่งในบรรทัดเดียวกันได้อย่างไร


30

ไม่ใช่ผู้เชี่ยวชาญใน Linux ไม่ใช่ Unix ฉันสงสัยว่าความแตกต่างระหว่างทั้งสองวิธีของการ stringing 2 คำสั่งในบรรทัดเดียวกันคืออะไร? ฉันไม่เห็นความแตกต่างของผลลัพธ์ในตัวอย่างง่าย ๆ นี้

Pete$date ; time
Sun Mar 17 19:37:20 EDT 2013

real    0m0.000s
user    0m0.000s
sys 0m0.000s

Pete$date &&time
Sun Mar 17 19:37:46 EDT 2013

real    0m0.000s
user    0m0.000s
sys 0m0.000s

นี่ไม่ได้ทำให้เกิดปัญหาใด ๆ - ฉันแค่อยากรู้อยากเห็น ..

คำตอบ:


43

&&เป็นตรรกะ 'และ' อาร์กิวเมนต์แรกจะถูกประเมินค่าและอาร์กิวเมนต์ที่สองจะถูกประเมินเฉพาะถ้าอาร์กิวเมนต์แรกส่งคืนจริง เหตุผลก็คือ "false AND something" เป็น false เสมอดังนั้นไม่จำเป็นต้องประเมินอาร์กิวเมนต์ที่สองในกรณีนี้

ดังนั้นการใช้&&คุณต้องแน่ใจว่าคำสั่งที่สองไม่ได้ถูกเรียกใช้หากคำสั่งแรกรายงานข้อผิดพลาด ( trueแสดงโดยรหัสทางออก0ซึ่งบ่งชี้ว่าไม่มีข้อผิดพลาด) ในทางตรงกันข้าม;รันคำสั่งทั้งสองไม่ว่าผลลัพธ์ของคำสั่งแรกจะเป็นอะไร

สรุป: การผูกมัดด้วยคำสั่ง&&เป็นนิสัยที่ดี ตรงกันข้ามกับ;คำสั่งนั้นจะไม่ดำเนินการตามคำสั่งหากมีข้อผิดพลาดเกิดขึ้น


คุณหมายถึงที่0หมายtrueหรือ0หมายถึงความจริง - มีข้อผิดพลาด?
Michael Butler

1
@MichaelButler: หมายถึง0 trueฉันได้เพิ่มคำอธิบาย
azimut

26

;

ดำเนินการคำสั่งตามลำดับไม่ว่าสถานะการออกก่อนหน้านี้จะเป็นอย่างไร:

# sh -c "exit 0" ; echo "2nd command"
2nd command
# sh -c "exit 1" ; echo "2nd command"
2nd command

&&

ตรรกะและ

ดำเนินการคำสั่งถัดไป แต่เฉพาะในกรณีที่คำสั่งก่อนหน้านี้ประสบความสำเร็จ (สถานะออก0):

# sh -c "exit 0" && echo "2nd command"
2nd command
# sh -c "exit 1" && echo "2nd command"
#

||

ตรรกะหรือ

ดำเนินการคำสั่งถัดไป แต่เฉพาะในกรณีที่คำสั่งก่อนหน้านี้ล้มเหลว (สถานะออกไม่ได้ 0 ):

# sh -c "exit 0" || echo "2nd command"
#
# sh -c "exit 1" || echo "2nd command"
2nd command

6
นอกจากนี้ยังsh -c "exit 0"สามารถถูกแทนที่ด้วยtrueในตัวอย่างเหล่านี้และมีsh -c "exit 1" false
Flimm
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.