Как обрабатывать совпадения bash *, когда совпадений нет?
Следующий фрагмент кода bash прекрасно работает, когда есть *.txt
файлы в каталоге.
for txt in *.txt
do
echo "loading data from $txt"
done
Когда нет, буквальное *.txt
попадает в цикл как $txt (не хорошо).
Как мне изменить этот код, чтобы при отсутствии *.txt
файлы, do ... done
блок пропущен?
2 ответа
Похоже, у Google был ответ на этот вопрос.
Поместите это волшебное заклинание перед for
заявление:
shopt -s nullglob
Опция nullglob (ответ @kfmfe04) лучше всего подходит, если вы используете bash (не оболочку brand-X), и вам не нужно беспокоиться о том, чтобы изменить / сломать nullglob. В противном случае, вы можете использовать эту (немного более грязную) опцию:
for txt in *.txt
do
[ -e "$txt" ] || continue
echo "loading data from $txt"
done
Это автоматически пропускает файлы, которые не существуют (в основном, "*.txt", если совпадений не было, но, возможно, также файлы, которые были удалены между for
сгенерировал список и когда цикл до них добрался...)