Привет, друзья. Сегодня грузить дебагом и гиковскими вещами не буду, разберём простую, но важную тему: как проверить, существует ли файл.

Сделать это можно несколькими способами:

filename="test.txt"

if [ -f $filename ];
then
    echo "File exist"
fi

if test -f $filename;
then
   echo "File exist"
fi

В первом примере ключ -f означает = True if file exists and is a regular file. Возвращаем True, если файл существует и является обычным файлом (не директорией и не симлинком и т. п.).

Во втором примере я использую команду test. Оба этих примера делают одно и то же, но в большинстве случаев обычно используется первый вариант.

Команда test предназначена для проверки типа файла и сравнения чисел и строк. Возвращает код возврата 0 (истина) или 1 (ложь) в зависимости от вычисления выражения. Выражения могут быть как унарными, так и бинарными.

Ну а если подставить символ «!» в условие, то сработает обратная логика:

if [ ! -f $filename ];
if ! test -f $filename;

Здесь мы уже получим сообщение — указанный файл не найден. Для разных задач разные условия.

Да, часто возникают вопросы по ключу «-f», это не единственный ключ, их достаточно много, например можно проверить существование директории, сокета, установленные права и т. п. Табличку со всеми этими ключами я вынес отдельно сюда.

То же самое можно уместить в одну строчку, синтаксис будет таким:

[ ! -f "$filename" ] && echo "file not found" || echo "file exist"
Роман Шубин
Роман Шубин
CEO & CTO, Главред в «Цифровой улей»
Задать вопрос
Подобные конструкции, с одной стороны, удобные, но ОЧЕНЬ плохо читаются, так что советую использовать их по минимуму. Например, однострочник актуален в пайплайнах GitLab и т. п., где нужно умещать логику в одну строку.

Вещи с виду банальные, но важные, подобные конструкции очень часто используются в bash-скриптах. В этом посте я использую проверку существования файла для того, чтобы определить, подключён ли у меня сетевой диск. Опять же, всё зависит от задачи, которую ты хочешь решить.

Сегодня ещё увидимся после интеграции, а вот завтра устроим разгрузочный день, пятница как-никак. Ладно, давай пять, на связи!