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= то есть добавить некоторый символ к обеим цепочкам, что никак не влияет на результат сравнения, однако позволя- ет избежать синтаксической ошибки.