Главная >> Инструкции >> Проверка существования файла Bash

Проверка существования файла Bash

В операционных системах GNU/Linux любые объекты системы являются файлами. И проверка существования файла bash - наиболее мощный и широко применяемый инструмент для определения и сравнения в командном интерпретаторе.

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


Содержание статьи

Проверка существования файла Bash

Начать стоит с простого и более общего метода. Параметр -e позволяет определить, существует ли указанный объект. Не имеет значения, является объект каталогом или файлом.

#!/bin/bash
# проверка существования каталога
if [ -e $HOME ]
then
echo "Каталог $HOME существует. Проверим наличие файла"
# проверка существования файла
if [ -e $HOME/testing ]
then
# если файл существует, добавить в него данные
echo "Строка для существующего файла" >> $HOME/testing
echo "Файл существует. В него дописаны данные."
else
# иначе — создать файл и сделать в нем новую запись
echo "Файл не существует, поэтому создается."
echo "Создание нового файла" > $HOME/testing
fi
else
echo "Простите, но у вас нет Домашнего каталога"
fi

Пример работы кода:

Вначале команда test проверяет параметром -e, существует ли Домашний каталог пользователя, название которого хранится системой в переменной $HOME. При отрицательном результате скрипт завершит работу с выводом сообщения об этом. Если такой каталог обнаружен, параметр  продолжает проверку. На этот раз ищет в $HOME файл testing. И если он есть, то в него дописывается информация, иначе он создастся, и в него запишется новая строка данных.

Проверка наличия файла

Проверка файла Bash на то, является ли данный объект файлом (то есть существует ли файл), выполняется с помощью параметра -f.

#!/bin/bash
if [ -f $HOME ]
then
echo "$HOME — это файл"
else
echo "$HOME — это не файл"
if [ -f $HOME/.bash_history ]
then
echo "А вот .bash_history — файл"
fi
fi

Пример работы кода:

В сценарии проверяется, является ли $HOME файлом. Результат проверки отрицательный, после чего проверяется настоящий файл .bash_history, что уже возвращает истину.

На заметку: на практике предпочтительнее использовать сначала проверку на наличие объекта как такового, а затем — на его конкретный тип. Так можно избежать различных ошибок или неожиданных результатов работы программы.

Проверка файла на пустоту

Чтобы определить, является ли файл пустым, нужно выполнить проверку с помощью параметра -s. Это особенно важно, когда файл намечен на удаление. Здесь нужно быть очень внимательным к результатам, так как успешное выполнение этого параметра указывает на наличие данных.

#!/bin/bash
file=t15test
touch $file
if [ -s $file ]
then
echo "Файл $file содержит данные."
else
echo "Файл $file пустой."
fi
echo "Запись данных в $file..."
date > $file
if [ -s $file ]
then
echo "Файл $file содержит данные."
else
echo "Файл $file все еще пустой."
fi

Результат работы программы:

В этом скрипте файл создаётся командой touch, и при первой проверке на пустоту возвращается отрицательный результат. Затем в него записываются данные в виде команды date, после чего повторная проверка файла возвращает истину.

Выводы

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

Хороший тон в написании сценариев командного интерпретатора - сначала определить тип файла и его дальнейшую роль в программе, а затем уже проверять объект на существование.

Pеклама
Посмотреть детали

Anubis – это максимально легкое open-source решение, созданное специально для защиты небольших веб-ресурсов от бесконечного потока запросов от ботов и AI парсеров. Этот инструмент можно считать "ядерным вариантом", потому что он заставляет ботов выполнять вычисления похожие на майнинг криптовалюты. Но это неплохая альтернатива для тех, кто не может или не хочет использовать Cloudflare. Посмотреть детали

12 комментариев к “Проверка существования файла Bash”

  1. Спасибо, продолжайте в таком же духе.

    Например, хотелось бы рассмотреть скрипт копирования данных с одного ПК на другой, но только при наличии сетевого коннекта между ними.
    Если потеря пакетов пинга равна или превышает 80%, то прекратить попытки копирования данных. И как только потеря пингов минимальная, то возобновить копирование. Было бы сразу классно, если можно настроить продолжение копирования данных с места разрыва, а не с самого начала.

    Каким образом можно настроить такой bash -скрипт?

    Ответить
    • Спасибо за отзыв.

      Ну, это явно скрипт не быстрого приготовления. Более того, он тянет на коммерческую основу )

      Ответить
    • Чисто теоретически: скопировать можно перенаправляя cat или dd в соответствующий файл интерфейса, причём dd здесь более предпочтительно, т.к. можно дробить файл на части и сверять хэш-суммы переданных и принятых частей, по ним же можно судить и о качестве соединения, т.е. ping, по сути, и не нужен, ну, разве что для контроля существования соединения вообще.
      P.S.: было б время или надобность мне - я б взялся за написание подобного...а так...сорри...

      Ответить
  2. Статья не полная, я б всё же объединил с контролем существования ещё и контроль директорий, т.к. всё описываемое здесь автором статьи - это встроенная во все оболочки команда test и по сему не лишним было бы добавить описание и примеры по опциям этой команды: -a, -b, -c, -g, -h, -k, -p, -r, -t, -u, -w, -x, -o, -G, -S, -N, -nt, -ot, -ef и это только по файлам! А ещё есть: -d, -ne, -qe и т.д. (ещё много - лень перечислять).

    Ответить
  3. Всё забываю добавить, что наличие пустого файла удобнее проверять наличием отрицания:
    [ ! -s ./file ] && echo 'Пустой'
    Т.е., если файл пустой - сработает echo 'Пустой'

    Ответить
  4. Написал такой скрипт:

    #!/bin/bash
    if [-e $HOME]
    then
    echo 123
    fi

    Выдает следующую ошибку:
    ./script_1: line 2: [-e: команда не найдена

    Что не так?)

    Ответить
  5. Разобрался.
    Пропишите в консоли

    which [

    и вы поймете принцип действия этих проверок.
    (После [ должен быть пробел)

    Ответить

Оставьте комментарий