à¹à¸§à¸à¹à¸²à¸à¸±à¸ à¸à¸à¸±à¸à¸à¸´à¹à¸¨à¸©
สารบัญ:
- อ่านไฟล์ตามบรรทัดไวยากรณ์
- การอ่านบรรทัดไฟล์ตามตัวอย่างบรรทัด
- วิธีการอ่านไฟล์ทางเลือก
- ใช้การทดแทนกระบวนการ
- ใช้สตริงที่นี่
- การใช้ไฟล์ descriptor
- ข้อสรุป
เมื่อเขียนสคริปต์ Bash บางครั้งคุณจะพบว่าตัวเองอยู่ในสถานการณ์ที่คุณต้องอ่านไฟล์ทีละบรรทัด ตัวอย่างเช่นคุณอาจมีไฟล์ข้อความที่มีข้อมูลที่ควรประมวลผลโดยสคริปต์
ในบทช่วยสอนนี้เราจะพูดถึงวิธีอ่านไฟล์ทีละบรรทัดใน Bash
อ่านไฟล์ตามบรรทัดไวยากรณ์
ไวยากรณ์ทั่วไปที่สุดสำหรับการอ่านไฟล์ทีละบรรทัดมีดังนี้:
while IFS= read -r line do echo "$line" done < input_file
หรือรุ่นบรรทัดเดียวที่เทียบเท่า:
while IFS= read -r line; do echo $line; done < input_file
มันทำงานยังไง?
ไฟล์อินพุต (
input_file
) เป็นชื่อของไฟล์ที่คุณต้องการเปิดให้อ่านโดยคำสั่ง
read
คำสั่ง read อ่านบรรทัดไฟล์ตามบรรทัดโดยกำหนดแต่ละบรรทัดให้กับตัวแปร
line
เมื่อประมวลผลทุกบรรทัดในขณะที่ลูปจะยุติลง ตัวคั่นฟิลด์ภายใน (
IFS
) ถูกตั้งค่าเป็นสตริงว่างเพื่อรักษาช่องว่างนำหน้าและต่อท้ายซึ่งเป็นพฤติกรรมเริ่มต้นของคำสั่ง
read
การอ่านบรรทัดไฟล์ตามตัวอย่างบรรทัด
ลองมาดูตัวอย่างต่อไปนี้ สมมติว่าเรามีไฟล์ชื่อ
distros.txt
ที่มีรายการการกระจาย Linux ที่ได้รับความนิยมมากที่สุดและตัวจัดการแพ็คเกจของพวกเขาคั่นด้วยเครื่องหมายจุลภาค (
,
):
Ubuntu, apt Debian, apt CentOS, yum Arch Linux, pacman Fedora, dnf
หากต้องการอ่านไฟล์ทีละบรรทัดคุณจะเรียกใช้รหัสต่อไปนี้ใน terminal ของคุณ:
while IFS= read -r line do echo "$line" done < distros.txt
รหัสจะอ่านไฟล์ทีละบรรทัดกำหนดแต่ละบรรทัดให้กับตัวแปรและสะท้อนตัวแปร พื้นฐานคุณจะเห็นผลลัพธ์เดียวกันกับที่คุณแสดงเนื้อหาไฟล์โดยใช้คำสั่ง cat
ถ้าคุณต้องการพิมพ์เฉพาะการกระจายที่ใช้ apt วิธีหนึ่งคือใช้คำสั่ง if และตรวจสอบว่าบรรทัดมีสตริงย่อย apt หรือไม่:
while IFS= read -r line do if]; then echo "$line" fi done < distros.txt
Ubuntu, apt Debian, apt
เมื่ออ่านไฟล์ทีละบรรทัดคุณยังสามารถส่งผ่านตัวแปรมากกว่าหนึ่งตัวไปยังคำสั่ง read ซึ่งจะแบ่งบรรทัดออกเป็นฟิลด์ตาม
IFS
เขตข้อมูลแรกถูกกำหนดให้กับตัวแปรแรก, ตัวแปรที่สองถึงตัวแปรที่สองและอื่น ๆ หากมีฟิลด์มากกว่าตัวแปรฟิลด์ฟิลด์ที่เหลือจะถูกกำหนดให้กับตัวแปรสุดท้าย
ในตัวอย่างต่อไปนี้เรากำลังตั้งค่า IFS เป็นเครื่องหมายจุลภาค (
,
) และส่งผ่านสองตัวแปร
distro
และ
pm
ไปยังคำสั่ง read ทุกอย่างตั้งแต่ต้นบรรทัดจนถึงเครื่องหมายจุลภาคแรกจะถูกกำหนดให้กับตัวแปรแรก (
distro
) และส่วนที่เหลือของบรรทัดจะถูกกำหนดให้กับตัวแปรที่สอง (
pm
):
while IFS=, read -r distro pm do echo "$pm" is the package manager for "$distro" done < distros.txt
apt is the package manager for Ubuntu apt is the package manager for Debian yum is the package manager for CentOS pacman is the package manager for Arch Linux dnf is the package manager for Fedora
วิธีการอ่านไฟล์ทางเลือก
ใช้การทดแทนกระบวนการ
การทดแทนกระบวนการอนุญาตให้คุณส่งผ่านเอาต์พุตจากคำสั่งเป็นชื่อไฟล์:
while IFS= read -r line do echo "$line" done < <(cat input_file)
ใช้สตริงที่นี่
Here String เป็นตัวแปรของเอกสาร Here สตริง
(cat input_file)
จะเก็บบรรทัดใหม่ไว้:
while IFS= read -r line do echo "$line" done <<< $(cat input_file)
การใช้ไฟล์ descriptor
คุณยังสามารถระบุอินพุตให้กับลูปโดยใช้ file descriptor:
while IFS= read -r -u9 line do echo "$line" done 9< input_file
เมื่อทำงานกับ file descriptors ให้ใช้ตัวเลขระหว่าง 4 ถึง 9 เพื่อหลีกเลี่ยงข้อขัดแย้งกับ file descriptors ของเชลล์ภายใน
ข้อสรุป
ใน Bash เราสามารถอ่านไฟล์แบบทีละบรรทัดได้โดยระบุชื่อไฟล์เป็นอินพุตไปยังลูป read while
bash terminal