Главная >> Инструкции >> Проверка существования файла 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, а также его пустоты. Обе функции дополняют друг друга, поэтому использовать их в связке - эффективный приём.

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

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 [

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

    Ответить

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