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