หากต้องการอ่านไฟล์ข้อความอย่างแท้จริงอย่าใช้ข้อความธรรมดาread
ซึ่งประมวลผลเอาต์พุตในสองวิธี:
read
ตีความ\
ว่าเป็นตัวละครหนี ใช้read -r
เพื่อปิดการทำงานนี้
read
แยกออกเป็นคำในตัวละครใน$IFS
; ตั้งค่าIFS
เป็นสตริงว่างเพื่อปิด
สำนวนปกติในการประมวลผลไฟล์ข้อความทีละบรรทัดคือ
while IFS= read -r line; do …
สำหรับคำอธิบายของสำนวนนี้ให้ดูที่เหตุใดจึงมีการwhile IFS= read
ใช้บ่อย ๆ แทนที่จะเป็นIFS=; while read..
? .
ในการเขียนสตริงอย่างแท้จริงไม่เพียง แต่ใช้ธรรมดาecho
ซึ่งประมวลผลสตริงได้สองวิธี:
- ในบางเชลล์
echo
ประมวลผลแบ็กสแลช (เมื่อทุบตีมันขึ้นอยู่กับว่าxpg_echo
มีการตั้งค่าตัวเลือก)
- สตริงบางตัวถือเป็นตัวเลือกเช่น
-n
หรือ-e
(ชุดที่แน่นอนขึ้นอยู่กับเชลล์)
printf
วิธีแบบพกพาในการพิมพ์สตริงแท้จริงอยู่กับ (ไม่มีวิธีที่ดีกว่าในการทุบตีถ้าคุณรู้ว่าการป้อนข้อมูลของคุณไม่ได้ดูเหมือนตัวเลือกecho
) ใช้แบบฟอร์มแรกเพื่อพิมพ์สตริงที่แน่นอนและรูปแบบที่สองหากคุณต้องการเพิ่มขึ้นบรรทัดใหม่
printf %s "$line"
printf '%s\n' "$line"
สิ่งนี้เหมาะสำหรับการประมวลผลข้อความเท่านั้นเนื่องจาก:
- เปลือกหอยส่วนใหญ่จะสำลักตัวอักษรว่างในอินพุต
- เมื่อคุณอ่านบรรทัดสุดท้ายคุณไม่มีทางรู้ว่ามีการขึ้นบรรทัดใหม่ตอนท้ายหรือไม่ (เชลล์ที่เก่ากว่าบางตัวอาจมีปัญหามากขึ้นหากอินพุตไม่ได้ขึ้นบรรทัดใหม่)
คุณไม่สามารถประมวลผลข้อมูลไบนารีในเชลล์ได้ แต่ยูทิลิตี้รุ่นทันสมัยใน Unices ส่วนใหญ่สามารถรับมือกับข้อมูลที่กำหนดเองได้ cat
ที่จะผ่านเข้าทั้งหมดผ่านการส่งออกการใช้ การไปแทนเจนต์echo -n ''
เป็นวิธีที่ไม่ยุ่งยากในการพกพา echo -n
จะดีเหมือนกัน (หรือไม่ขึ้นอยู่กับเปลือก) และ:
ง่ายและพกพาได้อย่างเต็มที่
: >| "$file"
cat >>"$file"
หรือง่ายกว่า
cat >|"$file"
ในสคริปต์คุณมักไม่จำเป็นต้องใช้>|
เนื่องจากnoclobber
ถูกปิดใช้งานตามค่าเริ่มต้น