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