Эта глава описывает команды, которые преимущественно полезны из-за
их кода возврата, чем их вывода. Т.о., они часто используются как
условия в выражениях `if', или как последная команда в канале.
`false' ничего не делает за исключением того, что возвращает
значение 1, означающий "ошибка". Она может использоваться для занимания
места в скриптах, где необходима неуспешная команда.
`false' игнорирует все аргументы коммандной строки, даже `--help'
и `--version', т.к. в противном случае изметится ожидаемое поведение, на
которое некоторые программисты расчитывают.
Эта версия `false' реализована на C и поэтому более защищена и
быстра, чем скрипт, и может безопасно использоваться как фиктивный
командный интерпретарор для выключенных профилей пользователей.
`true' ничего не делает кроме как возращает значение 0,
означающее "успех". Она может использоваться для занимания места в
скриптах, где необходима неуспешная команда, но встроенная команда
`:' (двоеточие) делает то же быстрее.
`true' игнорирует все аргументы коммандной строки, даже `--help'
и `--version', т.к. в противном случае изметится ожидаемое поведение, на
которое некоторые программисты расчитывают.
Эта версия `true' реализована на C и поэтому более защищена и
быстра, чем скрипт, и может безопасно использоваться как фиктивный
командный интерпретарор для выключенных профилей пользователей.
`test' возвращает значение 0 (истина) или 1 (ложь) в зависимости
от вполнения условного выражение ВЫРАЖ. Каждая часть выражения должна
быть отдельным аргументом.
`test' может выполнять проверки состояния файлов, строковые операции
и операции сравнения чисел.
Поскольку большинство командных оболочек имеют встроенную команду
с таким именем, использование неуточненного имени команды в скрипте
или интерактивно может привести к функциональных отличиям от данного
описания.
Кроме параметров описанных ниже, `test' понимает взятые в отдельности
`--help' или `--version'. раздел 2. Общие параметры. Единственный не
параметрический аргумент также допустим: `test' возвращает истину, если
аргумент не пустой.
Эти параметры проверяют отдельные типы файлов. (Все является файлом,
но не все файлы одинаковы!)
`-b ФАЙЛ'
Истинно, если ФАЙЛ существует и является специальным болчным устройством.
x@item -c ФАЙЛ
Истинно, если ФАЙЛ существует и является специальным символьным устройством.
`-d ФАЙЛ'
Истинно, если ФАЙЛ существует и является каталогом.
`-f ФАЙЛ'
Истинно, если ФАЙЛ вуществует и является простым файлом.
`-h ФАЙЛ'
`-L ФАЙЛ'
Истинно, если ФАЙЛ существует и является символической ссылкой.
`-p ФАЙЛ'
Истинно, если ФАЙЛ существует и является именованным каналом.
`-S ФАЙЛ'
Истинно, если ФАЙЛ существует и является сокетом.
`-t [ФД]'
Истинно, если ФД открыт на терминале. Если ФД опущен, он считается
равным 1 (стандартный вывод).
Эти параметры проверяют характеристики строк. Строки не закавычены
для `test', хотя Вам может понадобиться закавычить их для защиты символов
со специальным значением для командной оболочки, например, пробелов.
Сравнения чисел. Аргументы дожны быть полностью числовыми
(возможно отрицательными), или специальным выражением `-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
expr вычисляет выражение и пишет результат на стандартный
вывод. Каждая лексема выражение должна быть отдельным аргументом.
Операнды могут быть числами или строками. `expr' преобразует все,
что находится в позиции операнда, к целому числу или строке в зависимости
от применяемой операции.
Строки не закавычены для `test', хотя Вам может понадобиться
закавычить их для защиты символов со специальным значением для командной
оболочки, например, пробелов.
Операторы могут быть заданы как инфиксные символы или префиксные
ключевые слова. Скобки обычным образом для группировки (Вам нужно закавычить
скобки, для защиты их от вычисления командной оболочкой).
`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'.
`expr' поддерживает обычные арифметические операторы, в порядке
возрастания приоритета. Строковые операторы имеют более низкий
приоритет, связки более высокий.
`+ -'
Сложение и вычитание. Оба аргумента преобразуются в числа; ошибка выдается
если это невозможно.
`* / %'
Умножение, деление, остаток от деления. Оба аргумента преобразуются в числа; ошибка выдается
если это невозможно.
`expr' поддерживает обычные логические связки и отношение. Они
имеют более высокий приоритет, чем строковые или арифметические
операторы. Вот список в порядке возрастания приоритета.
`|'
Возвращает первый аргумент, если он не пустой и не 0, в противном
случае второй аргумент.
`&'
Возвращает свой первый аргумент, если он не пустой или 0,
иначе 0.
`< <= = == != >= >'
Сравнивает аргументы и возвращает 1 если отношение верно, 0 в противном
случае. `==' это синоним для `='. `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