Я думал, что это будет просто - но это оказывается сложнее, чем я ожидал.
Я хочу перебрать все файлы определенного типа в каталоге, поэтому я пишу это:
#!/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.