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 *.zip
berkembang ketika pola tidak cocok dengan file apa pun. ls
tanpa argumen daftar direktori saat ini.
ls
umumnya harus dihindari: Mengapa tidak parsing ls
? ; juga melihat tautan di dekat bagian atas halaman itu ke artikel ParsingLs BashGuide .
shopt -s nullglob
sebelum menjalankan loop for.