Вне всяких сомнений, чаще всего с инструкцией if используется команда test. Команда test может выполнять различные проверки и сравнения. Она имеет две эквивалентные формы:
test выражение
и более популярную
[ выражение ]
где выражение возвращает истинное (true) или ложное (false) значение. Команда test возвращает код завершения 0, если выражение истинно, и код завершения 1, если выражение ложно.
Выражения для проверки файлов
В табл. 27.1 перечислены выражения, используемые для проверки файлов.
Таблица 27.1. Выражения для проверки файлов
Выражение
|
Истинно, если...
|
файл1 -ef файл2
|
файл1 и файл2 имеют одно и то же число индексного узла (inode; то есть два имени принадлежат жестким ссылкам, ссылающимся на один и тот же файл)
|
файл1 -nt файл2
|
файл1 новее файла файл2
|
файл1 -ot файл2
|
файл1 старше файла файл2
|
-b файл
|
файл существует и является специальным файлом блочного устройства
|
-с файл
|
файл существует и является специальным файлом символьного устройства
|
-d файл
|
файл существует и является каталогом
|
-e файл
|
файл существует
|
-f файл
|
файл существует и является обычным файлом
|
-g файл
|
файл существует и имеет атрибут set-group-ID (бит setgid)
|
-G файл
|
файл существует и принадлежит действующей группе
|
-k файл
|
файл существует и имеет атрибут «sticky bit»
|
-L файл
|
файл существует и является символической ссылкой
|
-O файл
|
файл существует и принадлежит действующему пользователю
|
-p файл
|
файл существует и является именованным каналом
|
-r файл
|
файл существует и доступен для чтения (имеет разрешение на чтение для действующего пользователя)
|
-s файл
|
файл существует и имеет размер больше нуля
|
-S файл
|
файл существует и является сетевым сокетом
|
-t дескриптор_файла
|
дескриптор_файла представляет файл, подключенный к терминалу. Это выражение можно использовать для проверки стандартных потоков ввода/вывода/ошибок
|
-u файл
|
файл существует и имеет атрибут setuid
|
-w файл
|
файл существует и доступен для записи (имеет разрешение на запись для действующего пользователя)
|
-x файл
|
файл существует и доступен для выполнения (имеет разрешение на выполнение для действующего пользователя)
|
Следующий сценарий демонстрирует применение некоторых выражений с файлами:
#!/bin/bash
# test-file: проверка файла
FILE=~/.bashrc
if [ -e "$FILE" ]; then
if [ -f "$FILE" ]; then
echo "$FILE is a regular file."
fi
if [ -d "$FILE" ]; then
echo "$FILE is a directory."
fi
if [ -r "$FILE" ]; then
echo "$FILE is readable."
fi
if [ -w "$FILE" ]; then
echo "$FILE is writable."
fi
if [ -x "$FILE" ]; then
echo "$FILE is executable/searchable."
fi
else
echo "$FILE does not exist"
exit 1
fi
exit
Сценарий проверяет файл, имя которого присвоено константе FILE, и выводит результат. Этот сценарий имеет две интересные особенности, на которые следует обратить внимание. Во-первых, отметьте, что параметр $FILE внутри выражений заключен в кавычки. Это не является обязательным требованием, но защищает от случаев, когда параметр пуст. Если механизм подстановки заменит $FILE пустым значением, это приведет к ошибке (операторы в этом случае будут интерпретироваться как непустые строки, а не как операторы). Использование кавычек гарантирует, что за оператором всегда будет следовать строка, даже если она пустая. Во-вторых, обратите внимание на команду exit (в конце сценария). Команда exit принимает единственный необязательный аргумент, определяющий код возврата сценария. В отсутствие аргумента exit вернет значение по умолчанию 0. Такое использование exit позволит сценарию сообщить об ошибке, если в $FILE содержится имя несуществующего файла. Команда exit в самом конце сценария добавлена исключительно для формальности. Когда командная оболочка достигает конца сценария (то есть конца файла), она в любом случае завершает выполнение сценария с кодом завершения 0.
Аналогично, функции могут возвращать свой код завершения, передавая целочисленный аргумент команде return. Чтобы преобразовать сценарий, приведенный выше, в функцию для использования в больших программах, нужно заменить команды exit инструкциями return:
test_file () {
# test-file: проверка файла
FILE=~/.bashrc
if [ -e "$FILE" ]; then
Читать дальше