วิธีบอกทุบตีว่าบรรทัดต่อไปในบรรทัดถัดไป


101

ในสคริปต์ทุบตีฉันได้รับจากโปรแกรมเมอร์คนอื่นบางบรรทัดมีความยาวเกิน 80 คอลัมน์ อะไรคืออักขระหรือสิ่งที่จะเพิ่มในบรรทัดเพื่อระบุว่าบรรทัดต่อไปในบรรทัดถัดไป?


ดูการอภิปรายเพิ่มเติมที่stackoverflow.com/questions/18599711/…
enharmonic

คำตอบ:


136

อักขระเป็นเครื่องหมายแบ็กสแลช \

จากคู่มือทุบตี :

อาจใช้อักขระแบ็กสแลช "\" เพื่อลบความหมายพิเศษสำหรับอักขระถัดไปที่อ่านและสำหรับความต่อเนื่องของบรรทัด


ขอบคุณ. และขีด จำกัด ปกติในคอลัมน์ของสคริปต์ทุบตีคืออะไร?
เปิดทาง

bash ไม่มีขีด จำกัด คอลัมน์ที่น่าสนใจ เพื่อความชัดเจนคุณควรพยายาม จำกัด ไว้ที่ 70-80 ตัวอักษรต่อคอลัมน์
Habbie

10
@RyanM แบ็กสแลชจะต้องเป็นอักขระตัวสุดท้ายก่อนสิ้นสุดอักขระบรรทัด แน่ใจหรือว่าคุณไม่มีช่องว่างหลัง \?
George

9
@ จอร์จเย้. การเล่นซออีกเล็กน้อยพ่นข้อผิดพลาดด้วยไฟล์^M. ปัญหาดูเหมือนจะเป็นสคริปต์ที่มอบให้กับฉันโดยคนที่ใช้ windows dos2unixแก้ไขได้อย่างรวดเร็ว:)
RyanM

2
@ แสดงความคิดเห็นของคุณเพิ่งช่วยฉันฉันมีช่องว่างหลัง \ และฉันคิดไม่ออกว่าอะไรผิด ไชโย!
ffledgling

39

โดยทั่วไปคุณสามารถใช้แบ็กสแลชที่ท้ายบรรทัดเพื่อให้คำสั่งดำเนินต่อไปยังบรรทัดถัดไป อย่างไรก็ตามมีบางกรณีที่คำสั่งต่อเนื่องโดยปริยายกล่าวคือเมื่อบรรทัดลงท้ายด้วยโทเค็นที่ไม่สามารถยุติคำสั่งได้ตามกฎหมาย ในกรณีนี้เชลล์จะรู้ว่ากำลังจะมีมากขึ้นและสามารถละแบ็กสแลชได้ ตัวอย่างบางส่วน:

# In general
$ echo "foo" \
> "bar"
foo bar

# Pipes
$ echo foo |
> cat
foo

# && and ||
$ echo foo &&
> echo bar
foo
bar
$ false ||
> echo bar
bar

แตกต่างกัน แต่เกี่ยวข้องกันคือความต่อเนื่องโดยปริยายภายในเครื่องหมายคำพูด ในกรณีนี้หากไม่มีแบ็กสแลชคุณเพียงแค่เพิ่มบรรทัดใหม่ลงในสตริง

$ x="foo
> bar"
$ echo "$x"
foo
bar

ด้วยแบ็กสแลชคุณจะแยกบรรทัดตรรกะออกเป็นหลายบรรทัดตรรกะอีกครั้ง

$ x="foo\
> bar"
$ echo "$x"
foobar

มีรายการที่เป็นทางการของสถานการณ์ดังกล่าวหรือไม่โดยที่คำสั่งจะดำเนินต่อไปโดยปริยายในบรรทัดถัดไป? มันดูเหมือนว่าฉันว่าฉันจะปล่อยให้เครื่องหมายออกในบางสถานการณ์ภายใน[[- ]]สภาพ แต่ไม่ได้อยู่ในคนอื่น ๆ และฉันพยายามที่จะคิดออกกฎ
Menachem

16

\ทำงาน คำตอบของ @ Guillaume และความคิดเห็นของ @ George ตอบคำถามนี้อย่างชัดเจน ที่นี่ฉันจะอธิบายว่าทำไมThe backslash has to be the very last character before the end of line character.พิจารณาคำสั่งนี้:

   mysql -uroot \
   -hlocalhost      

หากมีช่องว่างหลังจาก\นั้นความต่อเนื่องของบรรทัดจะไม่ทำงาน เหตุผลก็คือ\ ลบความหมายพิเศษสำหรับอักขระถัดไปซึ่งเป็นช่องว่างไม่ใช่อักขระฟีดบรรทัดที่มองไม่เห็น อักขระฟีดบรรทัดอยู่หลังช่องว่างที่ไม่\อยู่ในตัวอย่างนี้


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