แบ็กสแลชได้รับการดูแลเป็นพิเศษโดยecho -e
แต่บางครั้งพวกเขาจะได้รับการดูแลเป็นพิเศษโดยเชลล์ (ซึ่งในกรณีนี้คือbash
) ตามกฎการอ้างอิงของเชลล์
อาร์กิวเมนต์จริงเห็นคือecho
Hello\\n
เพราะคุณได้ผ่าน-e
ไปecho
ก็ถือว่าทับขวาหนีออกมาเป็นพิเศษและจะทรุดลงไปเป็นหนึ่งเดียว\\
\
รอบชิงชนะเลิศn
ไม่ได้หลบหนีดังนั้นจึงปรากฏขึ้นอย่างแท้จริง
เหตุผลสำหรับเรื่องนี้คือก่อนที่จะแยกจากการทำงานของecho
ตัวมันเองเชลล์จะให้การดูแล\
เป็นพิเศษในบางบริบท unquoted \
ตัวละครได้รับการปฏิบัติเสมอพิเศษเดียวที่ยกมา \
จะไม่ได้รับการปฏิบัติเป็นพิเศษ แต่การรักษาของยกมาสองครั้ง \
ตัวละครในขณะที่คำสั่งที่คุณวิ่งเป็นที่ลึกซึ้งมากขึ้นและมีความซับซ้อน
เมื่อเปลือกพบข้อความยกมาสองครั้งในคำสั่งเช่นเดียวกับ"Hello\\\n"
ก็ถือว่า\
เป็นตัวหนีเมื่อมันนำหน้าตัวอักษรที่ตัวเองสามารถมีความหมายพิเศษภายในราคาคู่และไม่เป็นอย่างอื่น
- เพราะ
\
บางครั้งมีความหมายพิเศษภายใน""
เป็น\
ก่อนเกิดอีกมีผลของการอ้างที่สองว่า\
\
ดังนั้นภายในราคาคู่แรกจะทรุดลง\\
\
- หลังจากที่ทั้งสองคนแรกที่
\
ตัวละครมีความเป็นหนึ่งในสาม\
ตัวละครซึ่งเป็นผลกระทบจากสองครั้งแรกและผู้ที่นำไป n
แต่n
ไม่ใช่ตัวละครที่ได้รับการปฏิบัติเป็นพิเศษในเครื่องหมายคำพูดคู่ดังนั้น\
ก่อนที่มันจะไม่ได้รับการปฏิบัติเป็นพิเศษในสถานการณ์นี้ ดังนั้นการเข้าพัก\n
\n
ผลที่ได้คือว่าในราคาคู่ถูกตีความว่าเป็น\\\n
\\n
เมื่อecho -e
เห็น\\n
สิ่งแรก\
จะลบความหมายพิเศษออกจากข้อที่สองดังนั้นจึงecho
พิมพ์ออกมาอย่าง\n
แท้จริงสำหรับข้อความนั้น
ถ้าเป้าหมายของคุณคือการพิมพ์Hello
ด้วยการขึ้นบรรทัดใหม่พิเศษ แต่ไม่มีเครื่องหมาย (คำถามเดิมที่ไม่ชัดเจนเกี่ยวกับเรื่องนี้บวกฉันคิดว่ามันเป็นตัวอย่างที่มีประโยชน์) \
จากนั้นหนึ่งในการแก้ปัญหาคือการเอา ใช้echo -e "Hello\\n"
เอาต์พุตที่Hello
มีบรรทัดใหม่พิเศษในตอนท้าย
echo -e 'Hello\n'
ทางออกที่ดีคือการใช้คำพูดเดียวและการเขียน เครื่องหมายคำพูดเดี่ยวเป็นรูปแบบที่แข็งแกร่งที่สุดของการอ้างอิง วิธีการแก้ปัญหาที่ดียิ่งขึ้นมักจะใช้printf
แทนซึ่งในกรณีนี้จะเป็นecho
printf 'Hello\n\n'
หากเป้าหมายของคุณคือการพิมพ์Hello\
รวมถึงแบ็กสแลชแล้วตามด้วยการขึ้นบรรทัดใหม่แล้ววิธีการเสนอราคาแบบ double-quote ก็เป็นไปได้ แต่ก็ยุ่งยาก หากต้องการค้นหาให้ทำงานย้อนหลัง: echo -e
แปลง\\
เป็น\
และ\n
ขึ้นบรรทัดใหม่และเปลี่ยนเป็นสองเท่า\\
เพื่อ\
ให้คุณสามารถทำได้ด้วยเครื่องหมายแบ็กสแลชหกตัว ( echo -e "Hello\\\\\\n"
) เนื่องจาก\\n
กลายเป็น\n
แบ็กสแลชอันหนึ่งที่หนีอีกอันหนึ่ง คุณสามารถทำได้ด้วยห้าเพราะการโควตแบบสองครั้งจะคงไว้\n
เมื่อ\
ไม่รอด
สิ่งนี้แสดงให้เห็นถึงประโยชน์ของการอ้างเพียงครั้งเดียว: เพียงใส่สิ่งที่คุณต้องการecho -e
เห็นในเครื่องหมายคำพูดเดี่ยว ( echo -e 'Hello\\\n'
) printf
ก็ดีที่นี่ printf 'Hello\\\n\n'
ทางเลือกหนึ่งคือ แต่ที่printf
ส่องสว่างจริงๆคือคุณสามารถเสียบอาร์กิวเมนต์เพิ่มเติม คุณสามารถใช้printf '%s\n\n' 'Hello\'
ซึ่งแทรกอาร์กิวเมนต์ที่สอง (ตัวอักษรHello\
เพราะราคาเดียวไม่ได้เปลี่ยนอะไร) %s
ในสถานที่ของ