В операционных системах GNU/Linux любые объекты системы являются файлами. И проверка существования файла bash - наиболее мощный и широко применяемый инструмент для определения и сравнения в командном интерпретаторе.
В рамках интерпретатора Bash, как и в повседневном понимании людей, все объекты файловой системы являются, тем, чем они есть, каталогами, текстовыми документами и т.д. В этой статье будет рассмотрена проверка наличия файла Bash, а также его проверка на пустоту, и для этого используется команда test.
Содержание статьи
Проверка существования файла Bash
Начать стоит с простого и более общего метода. Параметр -e позволяет определить, существует ли указанный объект. Не имеет значения, является объект каталогом или файлом.
Пример работы кода:
Вначале команда test проверяет параметром -e, существует ли Домашний каталог пользователя, название которого хранится системой в переменной $HOME. При отрицательном результате скрипт завершит работу с выводом сообщения об этом. Если такой каталог обнаружен, параметр -е продолжает проверку. На этот раз ищет в $HOME файл testing. И если он есть, то в него дописывается информация, иначе он создастся, и в него запишется новая строка данных.
Проверка наличия файла
Проверка файла Bash на то, является ли данный объект файлом (то есть существует ли файл), выполняется с помощью параметра -f.
Пример работы кода:
В сценарии проверяется, является ли $HOME файлом. Результат проверки отрицательный, после чего проверяется настоящий файл .bash_history, что уже возвращает истину.
На заметку: на практике предпочтительнее использовать сначала проверку на наличие объекта как такового, а затем — на его конкретный тип. Так можно избежать различных ошибок или неожиданных результатов работы программы.
Проверка файла на пустоту
Чтобы определить, является ли файл пустым, нужно выполнить проверку с помощью параметра -s. Это особенно важно, когда файл намечен на удаление. Здесь нужно быть очень внимательным к результатам, так как успешное выполнение этого параметра указывает на наличие данных.
Результат работы программы:
В этом скрипте файл создаётся командой touch, и при первой проверке на пустоту возвращается отрицательный результат. Затем в него записываются данные в виде команды date, после чего повторная проверка файла возвращает истину.
Выводы
В статье была рассмотрена проверка существования файла bash, а также его пустоты. Обе функции дополняют друг друга, поэтому использовать их в связке - эффективный приём.
Хороший тон в написании сценариев командного интерпретатора - сначала определить тип файла и его дальнейшую роль в программе, а затем уже проверять объект на существование.
Спасибо! побольше таких статей! Очень полезно!
Спасибо за отзыв )
Спасибо, продолжайте в таком же духе.
Например, хотелось бы рассмотреть скрипт копирования данных с одного ПК на другой, но только при наличии сетевого коннекта между ними.
Если потеря пакетов пинга равна или превышает 80%, то прекратить попытки копирования данных. И как только потеря пингов минимальная, то возобновить копирование. Было бы сразу классно, если можно настроить продолжение копирования данных с места разрыва, а не с самого начала.
Каким образом можно настроить такой bash -скрипт?
Спасибо за отзыв.
Ну, это явно скрипт не быстрого приготовления. Более того, он тянет на коммерческую основу )
Чисто теоретически: скопировать можно перенаправляя cat или dd в соответствующий файл интерфейса, причём dd здесь более предпочтительно, т.к. можно дробить файл на части и сверять хэш-суммы переданных и принятых частей, по ним же можно судить и о качестве соединения, т.е. ping, по сути, и не нужен, ну, разве что для контроля существования соединения вообще.
P.S.: было б время или надобность мне - я б взялся за написание подобного...а так...сорри...
Можно ещё заюзать что-то из: scp, mc, sshfs, rsync, unison, но тут сложнее с контролем...
Статья не полная, я б всё же объединил с контролем существования ещё и контроль директорий, т.к. всё описываемое здесь автором статьи - это встроенная во все оболочки команда test и по сему не лишним было бы добавить описание и примеры по опциям этой команды: -a, -b, -c, -g, -h, -k, -p, -r, -t, -u, -w, -x, -o, -G, -S, -N, -nt, -ot, -ef и это только по файлам! А ещё есть: -d, -ne, -qe и т.д. (ещё много - лень перечислять).
Всё забываю добавить, что наличие пустого файла удобнее проверять наличием отрицания:
[ ! -s ./file ] && echo 'Пустой'
Т.е., если файл пустой - сработает echo 'Пустой'
В статье «пример работы кода» спутали с «примером кода»
Почему? Семантически всё правильно.
Написал такой скрипт:
#!/bin/bash
if [-e $HOME]
then
echo 123
fi
Выдает следующую ошибку:
./script_1: line 2: [-e: команда не найдена
Что не так?)
Разобрался.
Пропишите в консоли
which [
и вы поймете принцип действия этих проверок.
(После [ должен быть пробел)