bash line จะดำเนินการต่อหลังจาก && และ || เอกสาร?


28

ฉันได้เห็นโครงสร้างนี้ในสคริปต์จำนวนมากและใช้มันเอง แต่มันทำให้ฉันรำคาญใจที่ฉันไม่สามารถหามันได้ในเอกสารประกอบ

ตัวอย่าง:

[ -f file1 ] &&
[ -f file2 ] &&
echo "Both files exist." ||
echo "One or the other file doesn't exist."

สิ่งนี้สามารถทำได้ด้วยแบ็กสแลชก่อนขึ้นบรรทัดใหม่ดังที่ได้กล่าวไว้ในman bash:

If a \<newline> pair appears,  and  the  backslash  is  not
itself  quoted,  the \<newline> is treated as a line continuation (that
is, it is removed from the input stream and effectively ignored).

ตัวอย่าง:

[ -f file1 ] && \
[ -f file2 ] && \
echo "Both files exist." || \
echo "One or the other file doesn't exist."

... แต่สิ่งนี้ดูเหมือนจะไม่จำเป็น เวอร์ชันแรกข้างต้นใช้งานได้แม้ไม่มีแบ็กสแลช

ฉันจะหาสิ่งนี้ได้จากman bashที่ไหน? (นอกจากนี้ยังเป็นbashข้อกำหนดเฉพาะหรือ POSIX หรือไม่)


หากคุณกำลังมองหาเอกสารทุบตีอย่างเป็นทางการหรือ POSIX ดูคำตอบของ Gilles แต่สิ่งนี้ถูกกล่าวถึงในตัวควบคุมและการเปลี่ยนเส้นทางของเชลล์คืออะไร? - ข้อสังเกตเพิ่มเติมเกี่ยวกับ;, &,()และ
G-Man กล่าวว่า 'Reinstate Monica'

@ G-Man ฉันเดาว่าไม่ได้สนใจฉัน สำหรับผู้อ่านในอนาคตหรือไม่ ดังที่ฉันพูดในคำถาม"มันทำให้ฉันรำคาญใจที่ฉันไม่สามารถหามันได้ในเอกสารประกอบ" ฉันรู้แล้วว่ามันทำงานอย่างไรจริง ๆ แล้วนี่เป็นเพียงแค่ขอเอกสารอย่างเป็นทางการ :)
Wildcard

names=( Rama Soma<newline> Sita Diya )แม้ในกรณีของอาร์เรย์ที่มีความต่อเนื่องสายนัย: Python อธิบายสิ่งเหล่านี้ได้อย่างชัดเจนที่นี่แต่ดูเหมือนว่าเอกสาร Bash จะไม่ปรากฏ
jamadagni

คำตอบ:


39

การขึ้นบรรทัดใหม่จะถูกละเว้นในบริบทสองสามแห่งที่มีคำสั่งที่ไม่ถูกทำลายอย่างชัดแจ้ง บริบทเหล่านี้รวมถึงหลังจากที่ผู้ประกอบการควบคุม ( &&, ||, |, &, ;, ;;แต่ไม่ได้!)

ฉันไม่เห็นเอกสารนี้ในคู่มือทุบตี

ใน POSIX ก็ระบุผ่านทางกฎไวยากรณ์ เมื่อใดก็ตามที่กฎมีlinebreakคุณสามารถมีตัวแบ่งบรรทัดเป็นศูนย์หรือมากกว่านั้น


+1, ฉันไม่รู้ว่ามันใช้งานได้ง่ายสำหรับไพพ์ (|) ฉันหวังว่าเราจะสามารถวางพวกมันไว้ในบรรทัดถัดไปเพื่อให้อ่านได้ แต่มันก็ไม่ได้ผลเช่นนั้น (ถ้าทำอย่างนั้น
Olivier Dulac

1
@OlivierDulac มันจะทำงานได้อย่างไร? เมื่อประมวลผลบรรทัดคำสั่งปัจจุบันคุณจะทราบได้อย่างไรว่าคุณกำลังวางแผนที่จะพิมพ์|ที่จุดเริ่มต้นของบรรทัดถัดไป จำไว้ว่าเชลล์นั้นยังใช้แบบโต้ตอบไม่ใช่แค่ในสคริปต์และไวยากรณ์ก็เหมือนกัน
Barmar

@ บาร์เกอร์: ฉันรู้ว่าฉันรู้เรื่องนี้ (เขียนคอมไพเลอร์ที่โรงเรียน ^^) ... ฉันพูดว่า "ฉันต้องการ" และมันไม่ได้เป็นความปรารถนาที่น่าเชื่อถือมาก
Olivier Dulac

1
@DocSalvager คุณช่วยยกตัวอย่างข้อผิดพลาดเชิงตรรกะที่จะช่วยป้องกันได้หรือไม่? ฉันมีเวลายากที่จะเห็นมัน ....
ไวด์การ์ด

2
@DocSalvager ฉันจะไม่ใช้รหัสจริง ๆ ในขณะที่ฉันเขียนมันเป็นภาพประกอบ โดยไม่ต้องบรรทัดสุดท้าย (ประโยคอื่น) ฉันจะใช้มันอย่างนั้นแม้ว่า (สำหรับ "ถ้าสิ่งนี้และสิ่งนี้ก็ทำเช่นนั้น" this && this2 && thatก็โอเค แต่สำหรับelseประโยคที่ฉันใช้จริงif then else fi)
Wildcard
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.