Найти в Дзене
Герман Геншин

6 Bash-проверок, которые спасают ваши скрипты: ни один рабочий автомат не пишется без них!

В Bash, как и в других оболочках типа zsh, есть удобные условные операторы: можно узнать, файл это или папка, сравнить числа и многое другое. Такие тесты постоянно встречаются в реальных shell-скриптах — они делают код гибче и безопаснее. Давайте на практике разберём, как использовать эти проверки — на примерах из настоящих скриптов. Оператор -f определяет, ведёт ли указанный путь именно к файлу (а не к чему-то ещё, например, папке). Это один из самых полезных вариантов проверки. Обычно его используют так: Вот более короткий способ — сразу выдаёт результат проверки: В скриптах часто удобнее комбинировать логику с помощью операторов, но всё равно базовая команда [ нам нужна: Самый частый сценарий — попытка считать конфиг, который может отсутствовать на диске: А ещё -f помогает создавать уникальные имена файлов — чтобы случайно не перезаписать уже существующий файл: Когда цикл завершится, переменная filename будет содержать имя, не совпадающее ни с одним реальным файлом. RANDOM в shell
Оглавление

В Bash, как и в других оболочках типа zsh, есть удобные условные операторы: можно узнать, файл это или папка, сравнить числа и многое другое. Такие тесты постоянно встречаются в реальных shell-скриптах — они делают код гибче и безопаснее.

Давайте на практике разберём, как использовать эти проверки — на примерах из настоящих скриптов.

-f — как понять, что файл действительно существует

Оператор -f определяет, ведёт ли указанный путь именно к файлу (а не к чему-то ещё, например, папке). Это один из самых полезных вариантов проверки. Обычно его используют так:

Вот более короткий способ — сразу выдаёт результат проверки:

В скриптах часто удобнее комбинировать логику с помощью операторов, но всё равно базовая команда [ нам нужна:

Самый частый сценарий — попытка считать конфиг, который может отсутствовать на диске:

А ещё -f помогает создавать уникальные имена файлов — чтобы случайно не перезаписать уже существующий файл:

Когда цикл завершится, переменная filename будет содержать имя, не совпадающее ни с одним реальным файлом. RANDOM в shell выдаёт новое случайное число при каждом вызове.

Но полностью на этот способ для генерации случайных имён полагаться нельзя. Для временных файлов и папок надёжнее использовать mktemp.

-d — как узнать, существует ли папка

Оператор -d проверяет: существует ли указанный путь — и действительно ли это директория. Если файла нет или путь ведёт к чему-то другому — возвращает ложь.

Во многих скриптах приходится работать с папками — например, при архивировании через tar -C путь, чтобы загрузка или распаковка файлов шла именно туда. Перед этим папку удобно проверить вот так:

Здесь каталог создаётся только если его ещё нет. Да, mkdir -p не ругается, если папка уже существует, но проверка всё равно полезна — например, чтобы отдельно залогировать, почему возникла ошибка.

Также бывает, что скрипт после работы сам удаляет все созданные папки — например, временный кэш:

Я сам часто использую -d для быстрой проверки: действительно ли все элементы в переменной PATH — это каталоги:

-n — проверка, пуста ли строка

Оператор -n истинен (0), если строка не пуста, и ложен (1), если пуста. Для постоянных значений всё ясно, но вот переменные всегда надо проверять так:

Если переменная вообще не назначена, то она считается пустой — и проверка вернёт ложь.

Это особенно важно, если часть логики зависит от наличия значения: выполнять код стоит только если переменная определена. Часто, например, допускают отсутствие переменной окружения ZSH_VERSION, чтобы понять, запускается ли скрипт в zsh:

-z — тест на пустую строку

Оператор -z делает всё наоборот: возвращает истину, если строка пуста. Аналогичного результата можно добиться, инвертируя -n <!— но —>:

То есть -z и ! -n по сути равнозначны:

Тем не менее, -z обычно делает код проще и легче для чтения — особенно если рядом есть проверки на ненулевую длину. Это удобно, если, например, нужно сразу завершить функцию или скрипт, если значение не задано:

-x — можно ли запустить файл?

-x определяет, доступен ли файл для выполнения именно текущим пользователем. Bash смотрит на бит исполнения.

Этот тест незаменим, если вы вызываете внешние программы из скрипта:

Стандартные команды обычно есть, но если важно удостовериться в наличии утилиты, удобно комбинировать с command:

Здесь "$(command -v git)" вернёт путь к git. Если git не найден или нельзя запустить, скрипт выдаст ошибку и остановится.

-nt — какой файл новее?

Оператор -nt сравнивает два файла: первый свежей второго или нет? Формально, POSIX не гарантирует его поддержку — но в Bash и Zsh -nt работает отлично, для личных скриптов этого вполне достаточно.

С помощью -nt удобно искать самый новый файл в папке:

Похожего можно добиться через ls или find с конвейерами, но -nt обычно надёжнее, делает код чище и избавляет от неустойчивого парсинга вывода ls.

Подпишитесь на топовые советы: ничего важного не пропустите!

Ещё одна фишка — имитировать логику Make-файла:

Так Bash увидит изменения в исходнике и соберёт C-файл только если исходник изменился с прошлой сборки. Для случая, когда бинарника ещё не существует, используйте -f и -nt вместе:

Если вам понравилась эта статья, подпишитесь, чтобы не пропустить еще много полезных статей!

Премиум подписка - это доступ к эксклюзивным материалам, чтение канала без рекламы, возможность предлагать темы для статей и даже заказывать индивидуальные обзоры/исследования по своим запросам!Подробнее о том, какие преимущества вы получите с премиум подпиской, можно узнать здесь

Также подписывайтесь на нас в: