Bash nullglob: не обработать шаблон как имя файла

Категория: Bash · Язык: Bash · Обновлено:

Если glob в Bash не находит файлы, по умолчанию шаблон остаётся буквальной строкой, например ./logs/*.log. Скрипт может принять её за имя файла. Опция nullglob убирает несовпавший шаблон; массив сохраняет пути с пробелами и позволяет проверить пустой результат до обработки.

Безопасно перечислить совпавшие файлы

Bash
#!/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.