echo
การecho
ติดตั้งที่สอดคล้องกับข้อกำหนดของ Unix อย่างเคร่งครัดจะเพิ่มบรรทัดใหม่หากคุณ:
echo 'line1\nline2'
แต่นั่นไม่ใช่พฤติกรรมที่เชื่อถือได้ จริงๆแล้วมันไม่มีพฤติกรรมมาตรฐานใด ๆ ที่คุณคาดหวังecho
ได้
ถูกดำเนินการ
string
สตริงที่จะเขียนไปยังเอาต์พุตมาตรฐาน ถ้าตัวถูกดำเนินการเป็นครั้งแรก-n
หรือถ้าใด ๆ ของตัวถูกดำเนินประกอบด้วย< \
ทับขวา>ตัวละครที่ผลการดำเนินงานเป็นที่กำหนดไว้
เมื่อวันที่XSI สอดคล้องระบบถ้าตัวถูกดำเนินการแรกคือ-n
มันจะได้รับการปฏิบัติเป็นสตริง, ไม่ได้ตัวเลือก ลำดับอักขระต่อไปนี้จะถูกจดจำบนระบบที่สอดคล้องกับ XSI ภายในอาร์กิวเมนต์ใด ๆ :
\a
- เขียน<แจ้งเตือน>
\b
- เขียน<Backspace>
\c
- ระงับ<newline>ที่ตามหลังอาร์กิวเมนต์สุดท้ายในเอาต์พุต อักขระทั้งหมดที่ตามหลัง\c
ในอาร์กิวเมนต์จะถูกละเว้น
\f
- เขียน<form-feed>
\n
- เขียน<newline>
\r
- เขียน<ผลตอบแทนการขนส่ง>
\t
- เขียน<> แท็บ
\v
- เขียน<แนวตั้งแท็บ>
\\
- เขียนตัวอักษร<backslash>
\0num
- เขียนค่า 8 num
บิตที่เป็นศูนย์หนึ่งสองหรือสามหลักตัวเลขฐานแปด
ดังนั้นจึงไม่มีวิธีทั่วไปที่จะรู้วิธีเขียนบรรทัดใหม่ด้วยecho
ยกเว้นว่าคุณสามารถพึ่งพาเพียงแค่ทำecho
เช่นนั้น
bash
เปลือกมักจะไม่เป็นไปตามข้อกำหนดและจัดการ-n
และตัวเลือกอื่น ๆ แต่แม้ที่มีความไม่แน่นอน คุณทำได้:
shopt -s xpg_echo
echo hey\\nthere
hey
there
และไม่ใช่แม้กระทั่งสิ่งที่จำเป็นหากbash
ถูกสร้างขึ้นด้วยตัวเลือกบิลด์เวลา ...
--enable-xpg-echo-default
ทำให้echo
บิวด์อินขยายอักขระที่ไม่ใช้เครื่องหมายแบคสแลชโดยดีฟอลต์โดยไม่ต้องใช้-e
อ็อพชัน สิ่งนี้ตั้งค่าเริ่มต้นของxpg_echo
ตัวเลือกเชลล์เป็นon
ซึ่งทำให้ Bash echo
ทำงานเหมือนรุ่นที่ระบุใน Single Unix Specification รุ่น 3 ดูที่Bash Builtinsสำหรับคำอธิบายของ escape sequences ที่echo
รู้จัก
printf
ในทางตรงกันข้ามprintf
พฤติกรรมของมันค่อนข้างเชื่องเมื่อเปรียบเทียบ
หลักการและเหตุผล
ยูทิลิตี้ถูกเพิ่มเข้ามาเพื่อให้การทำงานที่ได้รับในอดีตให้บริการโดยprintf
echo
อย่างไรก็ตามเนื่องจากความแตกต่างที่แก้ไขไม่ได้ในรุ่นที่echo
มีอยู่ของรุ่นต่าง ๆทำให้รุ่นนี้มีคุณสมบัติพิเศษไม่กี่อย่างจึงเหลือคุณสมบัติเหล่านี้ไว้ในprintf
ยูทิลิตี้ใหม่นี้ซึ่งมีพื้นฐานอยู่ในระบบรุ่นที่เก้า
ส่วนรายละเอียด EXTENDED เกือบจะตรงกับprintf()
ฟังก์ชั่นในมาตรฐาน ISO C ถึงแม้มันจะอธิบายในแง่ของโน้ตรูปแบบไฟล์ในXBD รูปแบบไฟล์โน้ต
มันจัดการสตริงรูปแบบที่อธิบายถึงข้อโต้แย้งของ - ซึ่งสามารถเป็นจำนวนสิ่งใด ๆ แต่สำหรับสตริงที่มีสวยมากทั้ง%b
สตริง yte หรือ%s
trings ตัวอักษร นอกเหนือจาก%f
ormats ในอาร์กิวเมนต์แรกมันจะทำงานเหมือน%b
อาร์กิวเมนต์สตริง yte ส่วนใหญ่ยกเว้นว่ามันจะไม่จัดการกับการ\c
หลบหนี
printf ^%b%s$ '\n' '\n' '\t' '\t'
^
\n$^ \t$
ดูทำไมจึงprintf
ดีกว่าecho
? มากขึ้น
echo() printf
คุณอาจเขียนมาตรฐานของคุณเองecho
เช่น ...
echo(){
printf '%b ' "$@\n\c"
}
... ซึ่งน่าจะทำสิ่งที่ถูกต้องโดยอัตโนมัติ
อันที่จริงไม่ ... นั่นพิมพ์ตัวอักษร\n
ที่หางของการขัดแย้งถ้าอาร์กิวเมนต์สุดท้ายปลายในเลขคี่ของ<เครื่องหมาย>
แต่นี่ไม่ใช่:
echo()
case ${IFS- } in
(\ *) printf %b\\n "$*";;
(*) IFS=\ $IFS
printf %b\\n "$*"
IFS=${IFS#?}
esac
echo
ข้อบังคับหรือไม่printf
คุณสามารถใช้