Myślałem, że to będzie proste - ale okazuje się bardziej złożone niż się spodziewałem.
Chcę iterować wszystkie pliki określonego typu w katalogu, więc piszę:
#!/bin/bash
for fname in *.zip ; do
echo current file is ${fname}
done
Działa to tak długo, jak w katalogu jest co najmniej jeden pasujący plik . Jeśli jednak nie ma pasujących plików, otrzymuję to:
current file is *.zip
Potem spróbowałem:
#!/bin/bash
FILES=`ls *.zip`
for fname in "${FILES}" ; do
echo current file is ${fname}
done
Chociaż ciało pętli nie wykonuje się, gdy nie ma plików, otrzymuję błąd z ls:
ls: *.zip: No such file or directory
Jak napisać pętlę, która czysto nie obsługuje pasujących plików?
FILES=
; for fname in "${FILES}"...
for fname in *.zip ; do....
for file in *.zip
, nie `ls ...`
. Sugestia @ cuonglm jest taka, że *.zip
rozwija się do zera, gdy wzorzec nie pasuje do żadnego pliku. ls
bez argumentów wyświetla bieżący katalog.
ls
ogół należy unikać analizowania wyniku : Dlaczego nie parsować ls
? ; zobacz także link u góry tej strony do artykułu ParsingLs BashGuide .
shopt -s nullglob
przed uruchomieniem pętli for.