Tôi nghĩ rằng điều này sẽ đơn giản - nhưng nó đang chứng minh phức tạp hơn tôi mong đợi.
Tôi muốn lặp qua tất cả các tệp của một loại cụ thể trong một thư mục, vì vậy tôi viết điều này:
#!/bin/bash
for fname in *.zip ; do
echo current file is ${fname}
done
Điều này hoạt động miễn là có ít nhất một tệp phù hợp trong thư mục. Tuy nhiên nếu không có tệp phù hợp, tôi nhận được điều này:
current file is *.zip
Sau đó tôi đã thử:
#!/bin/bash
FILES=`ls *.zip`
for fname in "${FILES}" ; do
echo current file is ${fname}
done
Mặc dù phần thân của vòng lặp không thực thi khi không có tệp, tôi gặp lỗi từ ls:
ls: *.zip: No such file or directory
Làm thế nào để tôi viết một vòng lặp xử lý sạch không có tệp phù hợp?
FILES=
ls * .zip ; for fname in "${FILES}"...
nhưng nó làm việc như mong đợi vớifor fname in *.zip ; do....
for file in *.zip
, không `ls ...`
. Đề xuất của @ cuonglm là để *.zip
mở rộng thành không có gì khi mẫu không khớp với bất kỳ tệp nào. ls
không có đối số liệt kê các thư mục hiện tại.
ls
thường được tránh: Tại sao không phân tích cú pháp ls
? ; cũng thấy liên kết gần đầu trang đó với bài viết ParsingLs của BashGuide .
shopt -s nullglob
trước khi chạy vòng lặp for.