รันสองคำสั่งในกรณีของ || หรือ &&


11

ฉันได้อ่านเกี่ยวกับ && และ || และฉันต้องการเรียกใช้สองคำสั่งในกรณีเท็จ

ฉันได้พยายาม;แต่ที่ทำงานอยู่ตลอดเวลา ฉันได้ลองใส่ไว้ในวงเล็บปีกกา{ command1; command2 }แต่นั่นส่งผลให้เกิดข้อผิดพลาดทางไวยากรณ์

ฉันต้องการทำบางสิ่งเช่น

command && echo "Ok, continuing" || echo "Check internet connection"; exit 1

ซึ่งจะออกก็ต่อเมื่อไม่มีการเชื่อมต่ออินเทอร์เน็ต


1
ดูเหมือนว่าจะเป็นข้อผิดพลาดในการพิมพ์อย่างง่าย วิธีคำถามที่น่าสนใจมากขึ้นที่จะถามคือความแตกต่างระหว่างและ() {}
edwinksl

เกี่ยวข้องunix.stackexchange.com/q/187145/68757
heemayl

คำตอบ:


27

การใช้ parens ทำให้คำสั่งในเชลล์ย่อยซึ่งไม่ใช่สิ่งที่คุณต้องการ หรือใช้วงเล็บปีกกา:

command && echo "Ok, continuing" || { echo "Check internet connection"; exit 1; }

เคล็ดลับที่นี่คือว่าไม่เหมือน parens ;คำสั่งสุดท้ายในการจัดฟันจะต้องตามด้วย

เหตุใดจึงต้องใช้เครื่องหมายอัฒภาคหรือขึ้นบรรทัดใหม่

วงเล็บปีกกาเป็นอาร์กิวเมนต์ที่ถูกต้องสำหรับคำสั่ง ตัวอย่างเช่นนี่คือเครื่องหมายปีกกาแบบหยิกเป็นอาร์กิวเมนต์เพื่อecho:

$ echo }
}

ดังนั้นถ้าเชลล์เห็น:

{ command1; command2 }

ตีความเปลือก Command1 ว่ามีการขัดแย้งใดและ Command2 }ว่ามีหนึ่งอาร์กิวเมนต์ประกอบด้วยตัวอักษร วงเล็บปีกกา}จะถูกตีความว่าเป็นการปิดการจัดกลุ่มเท่านั้นหากเป็นไปตามเซมิโคลอนหรือขึ้นบรรทัดใหม่ หากต้องการทำงานด้านบน:

{ command1; command2; }

Subshells และความแตกต่างระหว่าง{...}และ(...)

สังเกตว่าค่าต่อไปนี้ตั้งค่าxเป็น 10 แต่การตั้งค่านั้นถูกลืมก่อนที่echoคำสั่งจะทำงาน:

$ x=0; false || ( echo Hello; x=10 )
Hello
$ echo $x
0

ด้วยการจัดฟันแบบเส้นตรงในทางตรงกันข้ามการตั้งค่าของx=10จะถูกจดจำ:

$ x=0; false || { echo Hello; x=10; }
Hello
$ echo $x
10

ความแตกต่างเป็นเพราะการกำหนดตัวแปรใน subshell ไม่รอดหลังจากที่ subshell เสร็จสมบูรณ์

เอกสาร

จากman bash:

(รายการ)

รายการจะถูกดำเนินการในสภาพแวดล้อม subshell (ดูคำสั่งการดำเนินการด้านสิ่งแวดล้อมด้านล่าง) การกำหนดตัวแปรและคำสั่ง builtin ที่ส่งผลกระทบต่อสภาพแวดล้อมของเชลล์จะไม่มีผลบังคับใช้หลังจากคำสั่งเสร็จสิ้น สถานะการส่งคืนคือสถานะการออกของรายการ

{รายการ; }

รายการจะถูกดำเนินการอย่างง่ายในสภาพแวดล้อมเชลล์ปัจจุบัน รายการจะต้องถูกยกเลิกด้วยการขึ้นบรรทัดใหม่หรืออัฒภาค สิ่งนี้เรียกว่าคำสั่งกลุ่ม สถานะการส่งคืนคือสถานะการออกของรายการ โปรดทราบว่าแตกต่างจาก metacharacters (และ), {และ} เป็นคำสงวนและจะต้องเกิดขึ้นเมื่อคำที่สงวนไว้ได้รับอนุญาตให้รับรู้ เนื่องจากไม่ทำให้เกิดการแบ่งคำจึงต้องแยกออกจากรายการด้วยช่องว่างหรือเชลล์ตัวอักขระอื่น

[เน้นเพิ่ม]

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