Специально для условного оператора sh(1) существует программа осуществляющая математические проверки, проверки на существование файловых объектов и равенство строк. В зависимости от результата сравнения эта программа возвращает либо ноль, либо единицу. Речь идёт о программе test(1).
Опции команды test(1)
Опция | Описание |
Проверки файловых объектов |
-e <file> |
Истина, если <file> существует независимо от того, чем он является |
-r <file> |
Истина, если <file> существует и из него можно читать |
-w <file> |
Истина, если <file> существует и в него можно писать |
-x <file> |
Истина, если <file> существует и его можно выполнить |
-s <file> |
Истина, если <file> существует и не пуст |
-b <file> |
Истина, если <file> существует и является блочным устройством |
-c <file> |
Истина, если <file> существует и является символьным устройством устройством |
-d <file> |
Истина, если <file> существует и является каталогом |
-f <file> |
Истина, если <file> существует и является обычным файлом |
-h <file> -L <file> |
Истина, если <file> существует и является символьной ссылкой. Опция -h оставлена для совместимости и не рекомендуется к использованию. |
-p <file> |
Истина, если <file> существует и является именованным каналом (FIFO) |
-S <file> |
Истина, если <file> существует и является сокетом |
-k <file> |
Истина, если <file> существует и на нём установлен stiсky-бит |
-t <num> |
Истина, если файловый дескриптор <num> существует и направлен на терминал. С помощью этой проверки можно убедиться направлен ли вывод скрипта на терминал или перенаправлен в файл |
-O <file> |
Истина, если <file> существует и его владелец тот же, что и EUID данного процесса |
-G <file> |
Истина, если <file> существует и его группа та же, что и EGID данного процесса |
<file1> -nt <file2> |
Истина, если файл <file1> новее (newer then) чем файл <file2> |
<file1> -ot <file2> |
Истина, если файл <file1> старше (older then) чем файл <file2> |
<file1> -et <file2> |
Истина, если файл <file1> и файл <file2> указывают на один и тот же файл |
Проверки строк |
-n <string> |
Истина, если строка <string> не пуста |
<string> |
Истина, если строка <string> не пуста |
-z <string> |
Истина, если строка <string> пуста |
<s1> = <s2> |
Истина, если строки <s1> и <s2> одинаковы |
<s1> != <s2> |
Истина, если строки <s1> и <s2> отличаются |
<s1> < <s2> |
Истина, если строка <s1> должна идти перед <s2> по кодам ASCII. Например "abc" < "abd" |
<s1> > <s2> |
Истина, если строка <s1> должна идти после <s2> по кодам ASCII |
Проверки чисел |
<n1> -eq <n2> |
Истина, если числа <n1> и <n2> равны (equal) |
<n1> -ne <n2> |
Истина, если числа <n1> и <n2> не равны (not equal) |
<n1> -ge <n2> |
Истина, если число <n1> больше либо равно <n2> (grater or equal) |
<n1> -gt <n2> |
Истина, если число <n1> строго больше <n2> (grater then) |
<n1> -le <n2> |
Истина, если число <n1> меньше либо равно <n2> (less or equal) |
<n1> -lt <n2> |
Истина, если число <n1> строго меньше <n2> (less then) |
Объединение условий |
-a |
И (and) |
-o |
Или (or) |
! |
инвертирование проверки |
(...) |
группирование для операторов «и» или «или» |
Для команды test(1) существует альтернативное имя [. Если она вызывается по имени [, то она разбирает командную строку вплоть до того, пока не встретит закрывающую квадратную скобку. Таким образом, следующие четыре конструкции эквивалентны:
$ test -d /usr/ports && echo "найдено дерево портов" || echo "Дерево портов не найдено"
$ [ -d /usr/ports ] && echo "найдено дерево портов" || echo "Дерево портов не найдено"
$ if test -d /usr/ports
> then echo "найдено дерево портов"
> else echo "Дерево портов не найдено"
> fi
$ if [ test -d /usr/ports ]
> then echo "найдено дерево портов"
> else echo "Дерево портов не найдено"
> fi
Обратите внимание: вокруг квадратных скобок обязательно должны быть пробелы, потому что [ это не синтаксическая конструкция sh(1), а обычная команда на подобии test(1).
Еще примеры. Проверка, существует ли файл:
if test -f filename
then
... действия, если файл filename существует
fi
Проверка переменной $timecnt на ноль:
if test $timecnt -ne 0
then
... действия, если $timecnt не равна нулю
fi
Внимание! При тестировании текстовых переменных обязательно берите эту переменную (или переменные) в двойные кавычки, например так неправильно:
if test $ipnatrules_curr != $ipnatrules_file
then
...
а так правильно:
if test "$ipnatrules_curr" != "$ipnatrules_file"
then
...
|