Как обрабатывать совпадения 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 сгенерировал список и когда цикл до них добрался...)

Другие вопросы по тегам