EXPR(1) EXPR(1)
НАЗВАНИЕ
expr - обработка аргументов как выражений
СИНТАКСИС
expr аргумент ...
ОПИСАНИЕ
Команда expr трактует свои аргументы как выражения. Ре-
зультат записывается на стандартный вывод. Операнды вы-
ражения должны быть разделены пробелами. Символы, имею-
щие для shell'а специальный смысл, должны быть экрани-
рованы. Заметим, что 0 возвращается в качестве числа, а
не для обозначения пустой цепочки символов. Аргументы,
содержащие пробелы или другие специальные символы,
должны быть заключены в кавычки. Перед целыми числами
может стоять знак минус. Внутреннее представление целых
чисел - 32-битное, в дополнительном коде.
Ниже приведен список знаков операций в порядке возврас-
тания приоритетов, операции с равным приоритетом заклю-
чены в фигурные скобки. Перед символами, которые должны
быть экранированы, стоит \.
выражение \| выражение
Если первое выражение не пустое и не нулевое, то
оно служит результатом; в противном случае - вто-
рое выражение.
выражение \& выражение
Если оба выражения не пустые и не нулевые, то ре-
зультатом служит первое выражение; в противном
случае - 0.
выражение { =, \>, \>=, \<, \<=, != } выражение
Если оба выражения - целые, они сравниваются как
числа; в противном случае - как цепочки символов.
Если условие истинно, результатом служит 1; в про-
тивном случае - 0.
выражение { +, - } выражение
Сложение и вычитание целочисленных аргументов.
выражение { \*, /, % } выражение
Умножение, деление и получение остатка от деления
целочисленных аргументов.
выражение : выражение
Оператор сопоставления : сопоставляет первый аргу-
мент со вторым, который должен быть регулярным вы-
ражением. Синтаксис регулярного выражения тот же,
что и в редакторе ed(1), за исключением того, что
все шаблоны трактуются как "закрепленные" и символ
^ не имеет специального значения. Обычно оператор
сопоставления возвращает число успешно сопостав-
ленных символов (0 при неудаче). Можно применять
конструкцию \( ... \), чтобы выделить часть перво-
го аргумента.
ПРИМЕРЫ
1. Увеличение на 1 shell-переменной a.
a=`expr $a + 1`
2. Выделение из маршрутного имени файла простого имени
(то есть из /usr/bin/ex выделяется ex). Внимание: оди-
ночный символ / будет воспринят как операция деления.
expr $a : '.*/\(.*\)' \| $a
Приведем теперь более удачное решение. Добавление //
устраняет проблемы, связанные с одиночным символом /, и
упрощает выражение.
expr //$a : '.*/\(.*\)'
3. Подсчет числа символов в значении переменной V.
expr $V : '.*'
СМ. ТАКЖЕ
ed(1), sh(1).
КОДЫ ЗАВЕРШЕНИЯ
В качестве побочного эффекта вычисления выражений expr
возвращает следующие коды завершения:
0 Значение выражения отлично от нуля и от пустой це-
почки символов.
1 Значение выражения есть нуль или пустая цепочка
символов.
2 Выражение некорректно.
ДИАГНОСТИКА
Команда expr выдает следующие сообщения об ошибках:
syntax error
При ошибках в операторах или операндах.
non-numeric argument
При попытках применения арифметических операций к
нечисловым цепочкам символов.
СЮРПРИЗЫ
Допустим, что мы хотим сравнить значение переменной a с
каким-либо символом, имеющим для expr особый смысл,
например, со знаком равенства. Пусть $a на самом деле
является знаком равенства. Так как аргументы предвари-
тельно обрабатываются shell'ом, то команда
expr $a = '='
будет воспринята как
expr = = =
что синтаксически некорректно. В подобных случаях реко-
мендуется пользоваться таким приемом:
expr X$a = X=
то есть добавить некоторый символ к обеим цепочкам, что
никак не влияет на результат сравнения, однако позволя-
ет избежать синтаксической ошибки.
|