ความแตกต่างระหว่างการใช้คืออะไร
echo -e "Hello\nWorld"
และ
echo $"Hello\nWorld"
ไม่เอาท์พุททั้งสอง:
Hello
World
echo $'Hello\nWorld'ซึ่งจะพิมพ์ออกมาสองบรรทัดภายใต้การทุบตี
ความแตกต่างระหว่างการใช้คืออะไร
echo -e "Hello\nWorld"
และ
echo $"Hello\nWorld"
ไม่เอาท์พุททั้งสอง:
Hello
World
echo $'Hello\nWorld'ซึ่งจะพิมพ์ออกมาสองบรรทัดภายใต้การทุบตี
คำตอบ:
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
*) echoไม่ได้เฉพาะเจาะจงจริง มันเกิดขึ้นที่มีคำสั่งใด ๆ ที่ตระหนักสั้นหรือยาวตัวเลือก (เขียนในลักษณะดั้งเดิม) และใช้ตัวถูกดำเนินการชื่อไฟล์รวมทั้ง lsเนื้อหาสถานการณ์เป็นเล็ก ๆ น้อย ๆ ที่เลวร้ายยิ่งมีechoตั้งแต่ (เป็นแหล่งที่มาของคุณกล่าวถึง) echoไม่ได้มักจะยอมรับที่จะบ่งบอกถึงการสิ้นสุดของตัวเลือกในขณะที่หนึ่งสามารถเขียนคำสั่งเช่น-- ls -- *l(และจริงๆแล้วเราควรเขียนคำสั่งด้วยวิธีนี้เมื่อใช้ globs ที่ขึ้นต้นด้วย*หรือ-โดยเฉพาะอย่างยิ่งในสคริปต์)
\nลำดับหนีดังนั้นในความเป็นจริงมันไม่สำคัญว่าถ้าผมใช้echo -e '...', echo $'...'หรือecho $"..."
Hello\nWorldสอง คุณต้องใช้-eสวิตช์เพื่อแปลอักขระการหลบหนี