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 หรือ%strings ตัวอักษร นอกเหนือจาก%formats ในอาร์กิวเมนต์แรกมันจะทำงานเหมือน%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คุณสามารถใช้