Bash nullglob: не обработать шаблон как имя файла
Если glob в Bash не находит файлы, по умолчанию шаблон остаётся буквальной строкой, например ./logs/*.log. Скрипт может принять её за имя файла. Опция nullglob убирает несовпавший шаблон; массив сохраняет пути с пробелами и позволяет проверить пустой результат до обработки.
Безопасно перечислить совпавшие файлы
#!/usr/bin/env bash
shopt -s nullglob
files=(./logs/*.log)
if ((${#files[@]} == 0)); then
printf 'Файлы .log не найдены\n'
else
for file in "${files[@]}"; do
printf '%s\n' "$file"
done
fiЕсли совпадений нет, массив files будет пустым и цикл не запустится. Включайте nullglob только в Bash: это не POSIX sh. Опция меняет состояние текущей оболочки до конца скрипта; если фрагмент подключается через source в интерактивную оболочку или библиотеку, восстановите исходное значение shopt после перечисления или выполните блок в subshell: вызов внутри функции сам по себе не локализует опцию. Не раскрывайте массив без кавычек — имена с пробелами разделятся на несколько аргументов.
Документация: Filename Expansion в Bash.