ต่อไปนี้อ่านไฟล์ที่ส่งผ่านเป็นอาร์กิวเมนต์บรรทัดต่อบรรทัด:
while IFS= read -r line; do
echo "Text read from file: $line"
done < my_filename.txt
นี่เป็นรูปแบบมาตรฐานสำหรับการอ่านบรรทัดจากไฟล์ในลูป คำอธิบาย:
IFS=
(หรือIFS=''
) ป้องกันช่องว่างนำหน้า / ต่อท้ายไม่ให้ถูกตัดแต่ง
-r
ป้องกัน backslash escapes จากการตีความ
หรือคุณสามารถวางไว้ในสคริปต์ผู้ช่วยเหลือไฟล์ bash เนื้อหาตัวอย่าง:
#!/bin/bash
while IFS= read -r line; do
echo "Text read from file: $line"
done < "$1"
หากบันทึกไว้ข้างต้นในสคริปต์ด้วยชื่อไฟล์readfile
มันสามารถเรียกใช้ดังนี้:
chmod +x readfile
./readfile filename.txt
หากไฟล์นั้นไม่ใช่ไฟล์ข้อความ POSIX มาตรฐาน (= ไม่สิ้นสุดด้วยอักขระขึ้นบรรทัดใหม่) คุณสามารถแก้ไขลูปเพื่อจัดการกับบางส่วนของบรรทัดที่ต่อท้ายได้:
while IFS= read -r line || [[ -n "$line" ]]; do
echo "Text read from file: $line"
done < "$1"
ที่นี่|| [[ -n $line ]]
ป้องกันไม่ให้บรรทัดสุดท้ายถูกละเว้นหากไม่ได้ลงท้ายด้วย a \n
(เนื่องจากread
ส่งคืนโค้ดออกที่ไม่เป็นศูนย์เมื่อพบ EOF)
หากคำสั่งภายในลูปยังอ่านจากอินพุตมาตรฐานตัวอธิบายไฟล์ที่ใช้โดยread
สามารถนำไปใช้กับสิ่งอื่นได้ (หลีกเลี่ยงตัวอธิบายไฟล์มาตรฐาน ) เช่น:
while IFS= read -r -u3 line; do
echo "Text read from file: $line"
done 3< "$1"
(อาจไม่ทราบว่าไม่ใช่ Bash shell ให้read -u3
ใช้read <&3
แทน)