Оператор test и условные выражения
Условные выражения, используемые в операторе test, строятся на основе проверки файловых атрибутов, сравнения строк и обычных арифметических сравнений. Сложные выражения строятся из следующих унарных или бинарных операций ("элементарных кирпичиков"):
- -a file
Верно, если файл с именем file существует.
- -b file
Верно, если file существует и является специальным файлом блочного устройства.
- -c file
Верно, если file существует и является специальным файлом символьного устройства.
- -d file
Верно, если file существует и является каталогом.
- -e file
Верно, если файл с именем file существует.
- -f file
Верно, если файл с именем file существует и является обычным файлом.
- -g file
Верно, если файл с именем file существует и для него установлен бит смены группы.
- -h file или -L file
Верно, если файл с именем file существует и является символической ссылкой.
- -k file
Верно, если файл с именем file существует и для него установлен "sticky'' bit.
- -p file
Верно, если файл с именем file существует и является именованным каналом (FIFO).
- -r file
Верно, если файл с именем file существует и для него установлено право на чтение
- -s file
Верно, если файл с именем file существует и его размер больше нуля.
- -t fd
Верно, если дескриптор файла fd открыт и указывает на терминал.
- -u file
Верно, если файл с именем file существует и для него установлен бит смены пользователя.
- -w file
Верно, если файл с именем file существует и для него установлено право на запись.
- -x file
Верно, если файл с именем file существует и является исполняемым.
- -O file
Верно, если файл с именем file существует и его владельцем является пользователь, на которого указывает эффективный идентификатор пользователя.
- -G file
Верно, если файл с именем file существует и принадлежит группе, определяемой эффективным идентификатором группы.
- -S file
Верно, если файл с именем file существует и является сокетом.
- -N file
Верно, если файл с именем file существует и изменялся с тех пор, как был последний раз прочитан.
- file1 -nt file2
Верно, если файл file1 имеет более позднее время модификации, чем file2. - file1 -ot file2
Верно, если файл file1 старше, чем file2. - file1 -ef file2
Верно, если файлы file1 и file2 имеют одинаковые номера устройств и индексных дескрипторов (inode). - -o optname
Верно, если задействована опция оболочки optname. Пояснения см. на странице man bash. - -z string
Верно, если длина строки равна нулю. - -n string
Верно, если длина строки не равна нулю. - string1 == string2
Верно, если строки совпадают. Вместо == может использоваться =. - string1 !== string2
Верно, если строки не совпадают. - string1 < string2
Верно, если строка string1 лексикографически предшествует строке string2 (для текущей локали). - string1 > string2
Верно, если строка string1 лексикографически стоит после строки string2 (для текущей локали). - arg1 OP arg2
Здесь OP - это одна из операций арифметического сравнения: -eq (равно), -ne (не равно), -lt (меньше чем), -le (меньше или равно), -gt (больше), -ge (больше или равно). В качестве аргументов могут использоваться положительные или отрицательные целые.
Из этих элементарных условных выражений можно строить сколь угодно сложные с помощью обычных логических операций ОТРИЦАНИЯ, И и ИЛИ:
- !(expression)
Булевский оператор отрицания. - expression1 -a expression2
Булевский оператор AND (И). Верен, если верны оба выражения. - expression1 -o expression2
Булевский оператор OR (ИЛИ). Верен, если верно любое из двух выражений.
Такие же условные выражения используются и в операторах while и until, которые мы рассмотрим чуть ниже.