บทความนี้เกี่ยวกับวิธีอ่านไฟล์ในสคริปต์ทุบตีโดยใช้ while loop . การอ่านไฟล์เป็นการดำเนินการทั่วไปในการเขียนโปรแกรม คุณควรคุ้นเคยกับวิธีการต่างๆ และวิธีการใช้งานที่มีประสิทธิภาพมากกว่า ใน bash งานเดียวสามารถทำได้หลายวิธี แต่มีวิธีที่ดีที่สุดในการทำงานให้เสร็จและเราควรปฏิบัติตามนั้นเสมอ
ก่อนดูวิธีการอ่านเนื้อหาไฟล์โดยใช้ while loop เป็นไพรเมอร์ด่วนเกี่ยวกับวิธีการทำงานของ while loop while loop ประเมินเงื่อนไขและวนซ้ำชุดโค้ดที่กำหนดเมื่อเงื่อนไขเป็นจริง
while [ CONDITION ] do code block done
มาทำลาย ในขณะที่วน ไวยากรณ์
- ขณะวนซ้ำ ควรเริ่มต้นด้วยคีย์เวิร์ด while ตามด้วยเงื่อนไข
- A เงื่อนไข ควรอยู่ภายใน [ ] หรือ [[ ]] . เงื่อนไขควรคืนค่าเป็นจริงเสมอเพื่อให้ดำเนินการวนซ้ำ
- บล็อกโค้ดจริงจะอยู่ระหว่าง do และเสร็จแล้ว .
NUMBER=0 while [[ $NUMBER -le 10 ]] do echo " Welcome ${NUMBER} times " (( NUMBER++ )) done
นี่เป็นตัวอย่างง่ายๆ โดยที่ วนรอบ ดำเนินการจนถึง NUMBER ไม่เกิน 10 และพิมพ์คำสั่ง echo
พร้อมกับขณะ เราจะใช้ อ่าน คำสั่งให้อ่านเนื้อหาของไฟล์ทีละบรรทัด ด้านล่างนี้คือไวยากรณ์ของ ในขณะที่ และ อ่าน คำสั่งต่างๆ รวมกัน ขณะนี้มีหลายวิธีในการส่งไฟล์เป็นอินพุต แล้วเราจะดูทั้งหมด
# SYNTAX while read VARIABLE do code done
การวางท่อใน Linux
โดยปกติเราจะใช้คำสั่ง cat เพื่อดูเนื้อหาของไฟล์จากเทอร์มินัล นอกจากนี้ เราจะไพพ์เอาต์พุตของ คำสั่ง cat ไปยังคำสั่งอื่นๆ เช่น grep, sort เป็นต้น
ในทำนองเดียวกัน เราจะใช้ คำสั่ง cat ที่นี่เพื่ออ่านเนื้อหาของไฟล์และไพพ์ไปยัง ชั่วขณะ ห่วง สำหรับการสาธิต ฉันใช้ /etc/passwd ไฟล์ แต่ไม่แนะนำให้ยุ่งกับไฟล์นี้ ดังนั้นให้สำรองไฟล์นี้และเล่นกับมันหากคุณต้องการ
cat /etc/passwd | while read LREAD do echo ${LREAD} done
มาดูรายละเอียดกันว่าจะเกิดอะไรขึ้นเมื่อส่งโค้ดด้านบนนี้
- แมว /etc/passwd จะอ่านเนื้อหาของไฟล์และส่งผ่านเป็นอินพุตผ่านไปป์
- อ่าน คำสั่งอ่านแต่ละบรรทัดที่ส่งผ่านเป็นอินพุตจากคำสั่ง cat และเก็บไว้ใน LREAD ตัวแปร.
- อ่าน คำสั่งจะอ่านเนื้อหาไฟล์จนถึง EOL ถูกตีความ
คุณยังสามารถใช้คำสั่งอื่นๆ เช่น head, tail, และ pipe it to while loop.
head -n 5 /etc/passwd | while read LREAD do echo ${LREAD} done
การเปลี่ยนเส้นทางอินพุตใน Linux
เราเปลี่ยนเส้นทางเนื้อหาของไฟล์ไปที่ while loop โดยใช้ตัวดำเนินการเปลี่ยนเส้นทางอินพุต (<)
.
while read LREAD do echo ${LREAD} done < /etc/passwd | head -n 5
คุณยังสามารถเก็บชื่อไฟล์ไว้ในตัวแปรและส่งผ่านตัวดำเนินการเปลี่ยนเส้นทางได้
FILENAME="/etc/passwd" while read LREAD do echo ${LREAD} done < ${FILENAME}
คุณยังสามารถส่งชื่อไฟล์เป็นอาร์กิวเมนต์ให้กับสคริปต์ของคุณได้
while read LREAD do echo ${LREAD} done < $1 | head -n 5
ตัวคั่นฟิลด์ภายใน
คุณสามารถทำงานกับรูปแบบไฟล์ประเภทต่างๆ (CSV , TXT , JSON ) และคุณอาจต้องการแยกเนื้อหาของไฟล์ตามตัวคั่นที่กำหนดเอง ในกรณีนี้ คุณสามารถใช้ “ตัวคั่นฟิลด์ภายใน (IFS) ” เพื่อแบ่งเนื้อหาของไฟล์และเก็บไว้ในตัวแปร
ให้ฉันสาธิตวิธีการทำงาน ลองดูที่ /etc/passwd ไฟล์ที่มีเครื่องหมายโคลอน (:)
เป็นตัวคั่น ตอนนี้คุณสามารถแยกแต่ละคำออกจากบรรทัดและเก็บไว้ในตัวแปรแยกต่างหากได้
ในตัวอย่างด้านล่าง ฉันกำลังแยก /etc/passwd ไฟล์ที่มีเครื่องหมายทวิภาคเป็นตัวคั่นของฉันและจัดเก็บแต่ละรายการแยกออกเป็นตัวแปรต่างๆ
while IFS=":" read A B C D E F G do echo ${A} echo ${B} echo ${C} echo ${D} echo ${E} echo ${F} echo ${G} done < /etc/passwd
ฉันแสดงเส้นแบ่งเพียงบรรทัดเดียวในภาพหน้าจอด้านบนโดยพิจารณาจากขนาดภาพหน้าจอ
เว้นบรรทัดใน Linux
บรรทัดว่างจะไม่ถูกละเว้นเมื่อคุณ วนซ้ำ ผ่านเนื้อหาไฟล์. เพื่อแสดงสิ่งนี้ ฉันได้สร้างไฟล์ตัวอย่างที่มีเนื้อหาด้านล่าง มี 4 บรรทัดและบรรทัดว่างไม่กี่บรรทัด ได้แก่ ช่องว่างนำหน้า ช่องว่างสีขาวต่อท้าย อักขระแท็บในบรรทัดที่ 2 และอักขระยกเว้นบางตัว (\n และ \t )
while read LREAD do echo ${LREAD} done < testfile
ดูผลลัพธ์บรรทัดว่างจะไม่ถูกละเว้น นอกจากนี้ สิ่งที่น่าสนใจที่ควรทราบก็คือ อ่าน . ตัดช่องว่างสีขาวอย่างไร สั่งการ. วิธีง่ายๆ ในการละเว้นบรรทัดว่างเมื่ออ่านเนื้อหาไฟล์คือการใช้ตัวดำเนินการทดสอบด้วย -z
แฟล็กที่ตรวจสอบว่าความยาวสตริงเป็นศูนย์หรือไม่ คราวนี้มาทำตัวอย่างเดิมซ้ำกัน แต่คราวนี้กับโอเปอเรเตอร์ทดสอบ
while read LREAD do if [[ ! -z $LREAD ]] then echo ${LREAD} fi done < testfile
จากเอาต์พุต คุณจะเห็นบรรทัดว่างถูกละเว้น
ตัวละครหนี
อักขระ Escape เช่น \n
, \t
, \c
จะไม่ถูกพิมพ์เมื่ออ่านไฟล์ เพื่อแสดงสิ่งนี้ ฉันใช้ไฟล์ตัวอย่างเดียวกันซึ่งมีอักขระหลีกไม่กี่ตัว
while read LREAD do echo ${LREAD} done < testfile
คุณสามารถเห็นได้จากอักขระหลีกเอาต์พุตสูญเสียความหมายและมีเพียง n และ ท ถูกพิมพ์แทน \n
และ \t
. คุณสามารถใช้ -r
เพื่อป้องกันการตีความแบ็กสแลช
while read -r LREAD do echo ${LREAD} done < testfile
เพียงเท่านี้สำหรับบทความนี้ เราชอบที่จะได้ยินกลับจากคุณหากมีการตอบกลับหรือคำแนะนำใด ๆ ความคิดเห็นของคุณคือสิ่งที่ช่วยให้เราสร้างเนื้อหาที่ดีขึ้น คอยอ่านและสนับสนุนต่อไป