ฉันคิดว่ามันจะง่าย - แต่มันพิสูจน์ได้ซับซ้อนกว่าที่ฉันคาดไว้
ฉันต้องการวนซ้ำไฟล์ทั้งหมดของชนิดเฉพาะในไดเรกทอรีดังนั้นฉันจึงเขียนสิ่งนี้:
#!/bin/bash
for fname in *.zip ; do
echo current file is ${fname}
done
ทำงานได้ตราบใดที่มีไฟล์ที่ตรงกันอย่างน้อยหนึ่งไฟล์ในไดเรกทอรี อย่างไรก็ตามหากไม่มีไฟล์ที่ตรงกันฉันจะได้รับสิ่งนี้:
current file is *.zip
ฉันลองแล้ว:
#!/bin/bash
FILES=`ls *.zip`
for fname in "${FILES}" ; do
echo current file is ${fname}
done
ในขณะที่เนื้อความของลูปไม่ทำงานเมื่อไม่มีไฟล์ฉันได้รับข้อผิดพลาดจาก ls:
ls: *.zip: No such file or directory
ฉันจะเขียนลูปที่จัดการไม่มีไฟล์ที่ตรงกันได้อย่างหมดจดได้อย่างไร
FILES=
ls * .zip ; for fname in "${FILES}"...
แต่ทำงานตามที่คาดไว้ด้วยfor fname in *.zip ; do....
for file in *.zip
`ls ...`
คำแนะนำของ @ cuonglm นั้น*.zip
จะขยายออกเป็นไม่มีอะไรเมื่อรูปแบบไม่ตรงกับไฟล์ใด ๆ ls
ไม่มีข้อโต้แย้งแสดงรายการไดเรกทอรีปัจจุบัน
ls
ทั่วไปที่ควรหลีกเลี่ยง: ทำไมไม่แยกls
? ; ดูลิงค์ใกล้ด้านบนของหน้านั้นไปยังบทความParsingLsของBashGuide
shopt -s nullglob
ก่อนเรียกใช้ลูป for