หากต้องการอ่านไฟล์ข้อความอย่างแท้จริงอย่าใช้ข้อความธรรมดา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ถูกปิดใช้งานตามค่าเริ่มต้น