ความแตกต่างระหว่าง echo -e“ <string>” และ echo $“ <string>”


20

ความแตกต่างระหว่างการใช้คืออะไร

echo -e "Hello\nWorld" 

และ

echo $"Hello\nWorld" 

ไม่เอาท์พุททั้งสอง:

Hello
World

1
คุณลองหรือยัง ผลลัพธ์ที่Hello\nWorldสอง คุณต้องใช้-eสวิตช์เพื่อแปลอักขระการหลบหนี
becko

4
สำหรับอันที่สองฉันสงสัยว่าคุณตั้งใจจะเขียนด้วยเครื่องหมายคำพูดเดี่ยวecho $'Hello\nWorld'ซึ่งจะพิมพ์ออกมาสองบรรทัดภายใต้การทุบตี
John1024

@ เบ็บใช่ฉันลองแล้วพวกเขาทั้งสองก็ให้ผลลัพธ์เหมือนกันหมด
ทำเครื่องหมาย

คำตอบ:


33

echo -eและecho $'...'ทั้งสองมีความคล้ายคลึงกันในการที่พวกเขาสนับสนุนลำดับการหลบหนีต่อไปนี้:

  \a     alert (bell)
  \b     backspace
  \e
  \E     an escape character
  \f     form feed
  \n     new line
  \r     carriage return
  \t     horizontal tab
  \v     vertical tab
  \\     backslash
  \0nnn  the eight-bit character whose value is the octal value nnn (zero to three octal digits)
  \xHH   the eight-bit character whose value is the hexadecimal value HH (one or two hex digits)
  \uHHHH the Unicode (ISO/IEC 10646) character whose value is the hexadecimal value HHHH (one to four hex digits)
  \UHHHHHHHH
         the Unicode (ISO/IEC 10646) character whose value is the hexadecimal value HHHHHHHH (one to eight hex digits)

พวกเขามีความแตกต่าง นอกเหนือจากด้านบนแล้วยังecho -eรองรับ:

  \c     suppress further output
  \0nnn  the eight-bit character whose value is the octal value nnn (zero to three octal digits)

ตรงกันข้าม$'....'สนับสนุน:

 \'     single quote
 \"     double quote
 \nnn   the eight-bit character whose value is the octal value nnn (one to three digits)
 \cx    a control-x character

สังเกตว่าระหว่างสอง\cส่วนขยายนั้นใช้ร่วมกันไม่ได้:

$ echo -e  'start\n\cIstop'
start
$ echo  $'start\n\cIstop'
start
        stop

สำหรับecho -eข้างต้นยับยั้งการส่งออกต่อไปจึงไม่สนใจ\c Istopในทางตรงกันข้ามสำหรับ$'...'การ\cIถูกตีความว่าเป็นแท็บ

รูปแบบที่คล้ายกัน: $"..."

ตรงกันข้ามกับ$'...'ฟังก์ชั่นของ$"..."มันแตกต่างกันมาก มันจะทำให้สตริงมันมีการแปลตามสถานที่ปัจจุบัน

การecho -eโต้เถียง

echo -eเชลล์ไม่ได้รับการสนับสนุนอย่างกว้างขวางและหลายคนมองว่า-eตัวเลือกเป็นความผิดพลาดในการออกแบบ สังเกต:

$ ls
-e  -n
$ echo *
$ printf "%s\n" *
-e
-n

อย่างที่คุณเห็นหากสิ่งที่คุณกำลังพิมพ์ด้วยการechoเริ่มต้นด้วยเส้นประผลลัพธ์อาจไม่คาดคิด ถ้าคุณไม่แน่ใจว่าสตริงแรกที่คุณจะพิมพ์ด้วยechoไม่เริ่มต้นด้วยเส้นประคุณน่าจะใช้งานprintfได้ดีกว่า

ด้วยเหตุผลเหล่านี้มาตรฐาน POSIX จึงสรุป :

แอปพลิเคชันใหม่ได้รับการสนับสนุนให้ใช้ printf แทน echo

เจตน์ราเมย์ผู้ดำรงรักษาไว้bash22 ปีที่ผ่านมาเห็นด้วย :

[N] รหัส ew ควรใช้ printf


1
นอกจากนี้ยังควรสังเกตว่าทั้งChetและPOSIXแนะนำให้ใช้printfมากกว่าecho
geirha

@geirha คะแนนดีมาก อัปเดตคำตอบแล้ว
John1024

1
ปัญหาของตัวเลือกที่ไม่คาดคิดจาก globs (เหมือน*) echoไม่ได้เฉพาะเจาะจงจริง มันเกิดขึ้นที่มีคำสั่งใด ๆ ที่ตระหนักสั้นหรือยาวตัวเลือก (เขียนในลักษณะดั้งเดิม) และใช้ตัวถูกดำเนินการชื่อไฟล์รวมทั้ง lsเนื้อหาสถานการณ์เป็นเล็ก ๆ น้อย ๆ ที่เลวร้ายยิ่งมีechoตั้งแต่ (เป็นแหล่งที่มาของคุณกล่าวถึง) echoไม่ได้มักจะยอมรับที่จะบ่งบอกถึงการสิ้นสุดของตัวเลือกในขณะที่หนึ่งสามารถเขียนคำสั่งเช่น-- ls -- *l(และจริงๆแล้วเราควรเขียนคำสั่งด้วยวิธีนี้เมื่อใช้ globs ที่ขึ้นต้นด้วย*หรือ-โดยเฉพาะอย่างยิ่งในสคริปต์)
Eliah Kagan

ขอบคุณสำหรับคำตอบอย่างฉันต้องออกกำลังกายสำหรับระบบปฏิบัติการของฉันแน่นอนและฉันต้องการที่จะพิมพ์ออกข้อความบางส่วนใช้\nลำดับหนีดังนั้นในความเป็นจริงมันไม่สำคัญว่าถ้าผมใช้echo -e '...', echo $'...'หรือecho $"..."
มาร์ค
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.