[Содержание]   [Назад]   [Пред]   [Вверх]   [След]   [Вперед]  


5. Условия

Эта глава описывает команды, которые преимущественно полезны из-за их кода возврата, чем их вывода. Т.о., они часто используются как условия в выражениях `if', или как последная команда в канале.

5.1 `false': Ничего не делать, неуспешно

`false' ничего не делает за исключением того, что возвращает значение 1, означающий "ошибка". Она может использоваться для занимания места в скриптах, где необходима неуспешная команда. `false' игнорирует все аргументы коммандной строки, даже `--help' и `--version', т.к. в противном случае изметится ожидаемое поведение, на которое некоторые программисты расчитывают.

Эта версия `false' реализована на C и поэтому более защищена и быстра, чем скрипт, и может безопасно использоваться как фиктивный командный интерпретарор для выключенных профилей пользователей.

5.2 `true': Ничего не делать, успешно

`true' ничего не делает кроме как возращает значение 0, означающее "успех". Она может использоваться для занимания места в скриптах, где необходима неуспешная команда, но встроенная команда `:' (двоеточие) делает то же быстрее.

`true' игнорирует все аргументы коммандной строки, даже `--help' и `--version', т.к. в противном случае изметится ожидаемое поведение, на которое некоторые программисты расчитывают.

Эта версия `true' реализована на C и поэтому более защищена и быстра, чем скрипт, и может безопасно использоваться как фиктивный командный интерпретарор для выключенных профилей пользователей.

5.3 `test': Проверяет типы файлов и сравнивает значения

`test' возвращает значение 0 (истина) или 1 (ложь) в зависимости от вполнения условного выражение ВЫРАЖ. Каждая часть выражения должна быть отдельным аргументом.

`test' может выполнять проверки состояния файлов, строковые операции и операции сравнения чисел.

Поскольку большинство командных оболочек имеют встроенную команду с таким именем, использование неуточненного имени команды в скрипте или интерактивно может привести к функциональных отличиям от данного описания.

Кроме параметров описанных ниже, `test' понимает взятые в отдельности `--help' или `--version'. раздел 2. Общие параметры. Единственный не параметрический аргумент также допустим: `test' возвращает истину, если аргумент не пустой.

5.3.1 Проверка типов файлов

Эти параметры проверяют отдельные типы файлов. (Все является файлом, но не все файлы одинаковы!)

`-b ФАЙЛ'
Истинно, если ФАЙЛ существует и является специальным болчным устройством. x@item -c ФАЙЛ Истинно, если ФАЙЛ существует и является специальным символьным устройством.
`-d ФАЙЛ'
Истинно, если ФАЙЛ существует и является каталогом.
`-f ФАЙЛ'
Истинно, если ФАЙЛ вуществует и является простым файлом.
`-h ФАЙЛ'
`-L ФАЙЛ'
Истинно, если ФАЙЛ существует и является символической ссылкой.
`-p ФАЙЛ'
Истинно, если ФАЙЛ существует и является именованным каналом.
`-S ФАЙЛ'
Истинно, если ФАЙЛ существует и является сокетом.
`-t [ФД]'
Истинно, если ФД открыт на терминале. Если ФД опущен, он считается равным 1 (стандартный вывод).

5.3.2 Проверка прав доступа

Эти параметры проверяют отдельные правва доступа.

`-g ФАЙЛ'
Истинно, если ФАЙЛ существует и имеет включенный бит установки идентификатора группы.
`-k ФАЙЛ'
Истинно, если ФАЙЛ имеет установленный "липкий" бит.
`-r ФАЙЛ'
Истинно, если ФАЙЛ существует и он читаемый.
`-u ФАЙЛ'
Истинно, если ФАЙЛ существует и имеет включенный бит установки идентификатора пользователя.
`-w ФАЙЛ'
Истинно, если ФАЙЛ существует и доступен для записи.
`-x ФАЙЛ'
Истинно, если ФАЙЛ существует и является исполняемым.
`-O ФАЙЛ'
Истинно, если ФАЙЛ существует и принадлежит текущему эффективному идентификатору пользователя.
`-G ФАЙЛ'
Истинно, если ФАЙЛ существует и принадлежит текущему эффективному идентификатору группы.

5.3.3 Проверка файловых характеристик

Эти параметры проверяют другие файловые характеристики.

`-e ФАЙЛ'
Истинно, если файл существует.
`-s ФАЙЛ'
Истинно, если ФАЙЛ существует и его размер больше нуля.
`ФАЙЛ1 -nt ФАЙЛ2'
Истинно, если ФАЙЛ1 новее (согласно дате изменения) чем ФАЙЛ2.
`ФАЙЛ1 -ot ФАЙЛ2'
Истинно, если ФАЙЛ1 старее (согласно дате изменения) чем ФАЙЛ2.
`ФАЙЛ1 -ef ФАЙЛ2'
Истинно, если ФАЙЛ1 и ФАЙЛ2 имеют одинаковые номера устройств и i-узлов, т.е. являются жесткими ссылками друг на друга.

5.3.4 Строковые тесты

Эти параметры проверяют характеристики строк. Строки не закавычены для `test', хотя Вам может понадобиться закавычить их для защиты символов со специальным значением для командной оболочки, например, пробелов.

`-z СТРОКА'
Истинно, если длина СТРОКИ равна нулю.
`-n СТРОКА'
`СТРОКА'
Истинно, если длина СТРОКИ не равна нулю.
`СТРОКА1 = СТРОКА2'
Истинно, если строки равны.
`СТРОКА1 != СТРОКА2'
Истинно, если строки не равны.

5.3.5 Численные тесты

Сравнения чисел. Аргументы дожны быть полностью числовыми (возможно отрицательными), или специальным выражением `-l СТРОКА', которая определяет длину СТРОКИ.

`АРГ1 -eq АРГ2'
`АРГ1 -ne АРГ2'
`АРГ1 -lt АРГ2'
`АРГ1 -le АРГ2'
`АРГ1 -gt АРГ2'
`АРГ1 -ge АРГ2'
Эти двоичные арифметические операторы возращают истину, если АРГ1 равен, не равен, меньше, меньше или равен, больше, больще или равен чем АРГ2, соответсвенно.

Например:

     test -1 -gt -2 && echo yes
     => yes
     test -l abc -gt 1 && echo yes
     => yes
     test 0x100 -eq 1
     error--> test: ожидалось целочисленное выражение перед -eq

5.3.6 Связки для `test'

Обычные логические связки.

`! ВЫРАЖ'
Истинно, если ВЫРАЖ ложно.
`ВЫРАЖ1 -a ВЫРАЖ2'
Истинно, если оба ВЫРАЖ1 и ВЫРАЖ2 истинны.
`ВЫРАЖ1 -o ВЫРАЖ2'
Истинно, если ВЫРАЖ1 или ВЫРАЖ2 истинны.

5.4 `expr': Вычисление выражений

expr вычисляет выражение и пишет результат на стандартный вывод. Каждая лексема выражение должна быть отдельным аргументом.

Операнды могут быть числами или строками. `expr' преобразует все, что находится в позиции операнда, к целому числу или строке в зависимости от применяемой операции.

Строки не закавычены для `test', хотя Вам может понадобиться закавычить их для защиты символов со специальным значением для командной оболочки, например, пробелов.

Операторы могут быть заданы как инфиксные символы или префиксные ключевые слова. Скобки обычным образом для группировки (Вам нужно закавычить скобки, для защиты их от вычисления командной оболочкой).

Возвращаемое значение:

`0'
Если выражение не пустое и не нуль
`1'
Если выражение пустое или нуль
`2'
Неверное выражение

5.4.1 Строковые выражения

`expr' подерживает проверку по шаблону и другие строковые операторы. Они имеют более низкий приоритет чем арифметические операторы и операторы отношения.

`СТРОКА : РЕГВЫР'
Выполнить проверку по шаблону. Аргументы преобразуются в строки и второй считается (простым, как в GNU `grep') регулярным выражением, с неявно предваренным `^'. Первый аргумент проверяется на это регулярное выражение. Если проверка прошла успешно и РЕГВЫР содержит `\(' and `\)', выражение `:' возвращает часть СТРОКИ, которая соответсвует подвыражению; в противном случае оно возвращает числа соответствующих символов. Иесли проверка оказалась неуспешной, выражение `:' возвращает пустую строку, если РЕГВЫР содержит `\(' and `\)', иначе 0. Только первая пара `\( ... \)' используется в возвращаемом значении; дополнительные пары имеют смысл только для группировки операторов регулярных выражений. В регулярном выражении `\+', `\?', и `\|' являются операторами, которые соответствуют соврадению один или более, нуль или более, нуль или один раз, или разделяет альтернативы. SunOS `expr'ы трактуют их как регулярные символы. (POSIX допускает иное поведение.)
`match СТРОКА РЕГВЫР'
Альтернативный способ поверки по шаблону. Это тоже самое, что и `СТРОКА : РЕГВЫР'.
`substr СТРОКА ПОЗИЦИЯ ДЛИНА'
Возвращает подстроку СТРОКи начинающуюся в ПОЗИЦИИ с максимальной длмной ДЛИНА. Если ПОЗИЦИЯ или ДЛИНА отрицательны, равны нулю, или не числа, возвращается пустая строка.
`index СТРОКА НАБОР-СИМВОЛОВ'
Возвращает первую позицию в троке, где первый символ из НАБОРа-СИМВОЛОВ найден. Если символы из НАБОРа-СИМВОЛОВ не найдены в СТРОКе, возврашается 0.
`length СТРОКА'
Возвращает длину СТРОКи
`quote ЛЕКСЕМА'
Интерпретировать ЛЕКСЕМу как строку, даже если это ключевое слово как MATCH или оператор как `/'. Это делает возможным проверять `expr length quote "$x"' или `expr quote "$x" : '.*/\(.\)" и заставлять `expr' делать то, что нужно, даже если значение $x, например, `/' или `index'. Этот опрератор является расширением GNU. Он отключен, если переменная окружения `POSIXLY_CORRECT' установлена.

Чтобы заставить `expr' интерпретировать ключевые слова как строки, Вы должны использовать оператор `quote'.

5.4.2 Арифметические выражения

`expr' поддерживает обычные арифметические операторы, в порядке возрастания приоритета. Строковые операторы имеют более низкий приоритет, связки более высокий.

`+ -'
Сложение и вычитание. Оба аргумента преобразуются в числа; ошибка выдается если это невозможно.
`* / %'
Умножение, деление, остаток от деления. Оба аргумента преобразуются в числа; ошибка выдается если это невозможно.

5.4.3 Свзяки для `expr'

`expr' поддерживает обычные логические связки и отношение. Они имеют более высокий приоритет, чем строковые или арифметические операторы. Вот список в порядке возрастания приоритета.

`|'
Возвращает первый аргумент, если он не пустой и не 0, в противном случае второй аргумент.
`&'
Возвращает свой первый аргумент, если он не пустой или 0, иначе 0.
`< <= = == != >= >'
Сравнивает аргументы и возвращает 1 если отношение верно, 0 в противном случае. `==' это синоним для `='. `expr' сначала пытает преобразовать оба аргумента в числа и использовать численное сравнение, если это не удается сделать, используется лексическое сравнение.

5.4.4 Примеры использования `expr'

Вот несколько примеров использования кавычек для метасимволов командных оболочек.

Чтобы сложить 1 и переменную оболочки `foo' в оболочках совместимых с Борновыми:

     foo='expr $foo + 1'

Чтобы напечатать имя файла, хранимого в `$fname', без пути, который может не содержать `/':

     expr $fname : '.*/\(^.*\)' '^|' $fname

Пример, показывающий, что `\+' это оператор:

     expr aaa : 'a\+'
     => 3

     expr abc : 'a\(.\)c'
     => b
     expr index abcdef cz
     => 3
     expr index index a
     error--> expr: syntax error
     expr index quote index a
     => 0


[Содержание]   [Назад]   [Пред]   [Вверх]   [След]   [Вперед]