Saya pikir ini akan sederhana - tetapi terbukti lebih kompleks dari yang saya harapkan.
Saya ingin mengulang semua file dari jenis tertentu dalam direktori, jadi saya menulis ini:
#!/bin/bash
for fname in *.zip ; do
echo current file is ${fname}
done
Ini berfungsi selama ada setidaknya satu file yang cocok dalam direktori. Namun jika tidak ada file yang cocok, saya mendapatkan ini:
current file is *.zip
Saya kemudian mencoba:
#!/bin/bash
FILES=`ls *.zip`
for fname in "${FILES}" ; do
echo current file is ${fname}
done
Sementara badan loop tidak dieksekusi ketika tidak ada file, saya mendapatkan kesalahan dari ls:
ls: *.zip: No such file or directory
Bagaimana cara menulis loop yang dengan bersih menangani tidak ada file yang cocok?
FILES=ls * .zip ; for fname in "${FILES}"...tetapi berfungsi seperti yang diharapkan denganfor fname in *.zip ; do....
for file in *.zip, bukan `ls ...`. Saran @ cuonglm adalah agar tidak *.zipberkembang ketika pola tidak cocok dengan file apa pun. lstanpa argumen daftar direktori saat ini.
lsumumnya harus dihindari: Mengapa tidak parsing ls? ; juga melihat tautan di dekat bagian atas halaman itu ke artikel ParsingLs BashGuide .
shopt -s nullglobsebelum menjalankan loop for.