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 *.ziprozwija się do zera, gdy wzorzec nie pasuje do żadnego pliku. lsbez argumentów wyświetla bieżący katalog.
lsogół 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 nullglobprzed uruchomieniem pętli for.