Я думал, что это будет просто - но это оказывается сложнее, чем я ожидал.
Я хочу перебрать все файлы определенного типа в каталоге, поэтому я пишу это:
#!/bin/bash
for fname in *.zip ; do
echo current file is ${fname}
done
Это работает до тех пор, пока в каталоге есть хотя бы один соответствующий файл . Однако, если нет подходящих файлов, я получаю это:
current file is *.zip
Я тогда попробовал:
#!/bin/bash
FILES=`ls *.zip`
for fname in "${FILES}" ; do
echo current file is ${fname}
done
Хотя тело цикла не выполняется, когда нет файлов, я получаю сообщение об ошибке от ls:
ls: *.zip: No such file or directory
Как мне написать цикл, который чисто обрабатывает не соответствующие файлы?
FILES=
ls * .zip, ; for fname in "${FILES}"...
но он работает, как и ожидалось, сfor fname in *.zip ; do....
for file in *.zip
, нет `ls ...`
. Предложение @ cuonglm таково, что *.zip
расширяется до нуля, когда шаблон не соответствует ни одному файлу. ls
без аргументов перечисляет текущий каталог.
ls
вообще следует избегать синтаксического анализа выходных данных : почему бы неls
выполнить синтаксический анализ ? ; также смотрите ссылку в верхней части этой страницы на статью BashGuide's ParsingLs .
shopt -s nullglob
перед запуском цикла for.