6

Следующий фрагмент кода bash прекрасно работает, когда в каталоге есть файлы *.txt .

for txt in *.txt
do                                               
  echo "loading data from $txt"
done   

Когда их нет, литерал *.txt попадает в цикл как $ txt (не очень хорошо).

Как изменить этот код, чтобы при отсутствии файлов *.txt блок do ... done пропускался?

2 ответа2

9

Похоже, у Google был ответ на этот вопрос.

Поместите это волшебное заклинание перед заявлением for :

shopt -s nullglob
4

Опция nullglob (ответ @ kfmfe04) лучше всего подходит, если вы используете bash (не оболочку brand-X), и вам не нужно беспокоиться о том, чтобы изменить / сломать nullglob. В противном случае вы можете использовать эту (немного более грязную) опцию:

for txt in *.txt
do
  [ -e "$txt" ] || continue
  echo "loading data from $txt"
done

Это автоматически пропускает файлы, которые не существуют (в основном «* .txt», если совпадений не было, но, возможно, также файлы, которые были удалены между тем, когда for сгенерировал список и когда цикл добрался до них ...)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .