Bunun basit olacağını düşünmüştüm - ama beklediğimden daha karmaşık.
Bir dizindeki belirli bir türdeki tüm dosyaları yinelemek istiyorum, bu yüzden şunu yazarım:
#!/bin/bash
for fname in *.zip ; do
echo current file is ${fname}
done
Bu , dizinde en az bir eşleşen dosya olduğu sürece çalışır . Ancak eşleşen dosya yoksa, şunu alıyorum:
current file is *.zip
Sonra denedim:
#!/bin/bash
FILES=`ls *.zip`
for fname in "${FILES}" ; do
echo current file is ${fname}
done
Döngü gövdesi dosya olmadığında çalışmaz, ancak ls'den hata alıyorum:
ls: *.zip: No such file or directory
Eşleşen dosyaları temiz bir şekilde işleyen bir döngü nasıl yazarım?
FILES=
ls * .zip ; for fname in "${FILES}"...
fakat beklendiği gibi çalışırfor fname in *.zip ; do....
for file in *.zip
, kullan`ls ...`
. @ cuonglm'in önerisi, *.zip
kalıp herhangi bir dosyayla eşleşmediğinde hiçbir şeye genişlememesidir. ls
argümanlar olmadan geçerli dizini listeler.
ls
: genellikle kaçınılması gereken bir neden değil ayrıştırmak ls
? ; Ayrıca bu sayfanın üst kısmının yakınındaki BashGuide'un ParsingLs makalesine bakınız.
shopt -s nullglob
For döngüsünü çalıştırmadan önce ekleyin .