Bsdadmin.ru

Записки администратора FreeBSD

Путь на сайте

Домашняя Mans FreeBSD по-русски expr - вычислить выражение

expr - вычислить выражение

EXPR(1)

НАЗВАНИЕ
expr -- вычислить выражение

СИНТАКСИС
expr [-e] выражение

ОПИСАНИЕ
Утилита expr вычисляет выражение и пишет результат в стандартный вывод. Все операторы и операнды должны передаваться, как отдельные аргументы. Некоторые операторы имеют специальное значение для командных интерпрета торов и, следовательно, должны заключаться в кавычки. Все целочисленные операнды интерпретируются как числа с основанием 10. Арифметические операции выполняются, используя целочисленную знаковую математику.

Если указан флаг -e, арифметика использует тип данных intmax_t языка C (самый большой целочисленный тип данных), и expr сможет обнаружить арифметическое переполнение и вернуть индикатор ошибки. Если указан числовой операнд, являющийся настолько большим, что происходит переполнение при конвертации его в целое число, то он обрабатывается как строка.
Если флаг -e не указан, то переполнение в результате арифметических вычислений и синтаксического разбора целочисленных аргументов будет происходить без диагностики и в соответствии с правилами стандарта языка C, используя тип данных long. Операторы перечислены ниже в порядке увеличения приоритета. Все они вычисляются слева направо. Операторы с одинаковым приоритетом сгруппированы внутри символов `{' и `}'.

выражение1 | выражение2.  
Вернуть вычисленное значение выражения выражение1, если оно не является ни пустой строкой, ни нулём. Иначе возвращается значение выражение2.

выражение1 & выражение2
Вернуть значение выражения выражение1, если ни одно из выражений при вычислении не становится равным пустой строке или нулю. В противном случае, возвращается ноль.

выражение1 {=, >, >=, <, <=, !=} выражение2
Вернуть результаты целочисленного сравнения, если оба аргумента являются целыми числами. В противном случае возвращает резуль- таты сравнения строк, используя зависящую от региональных настроек последовательность сравнения. Результат каждого сравнения равен 1, если указанное соотношение справедливо, или 0, если соотношение ложно.

выражение1 {+, -} выражение2
 Вернуть результаты сложения или вычитания целочисленных аргументов.

  выражение1 {*, /, %} выражение2
Вернуть результаты умножения, целочисленного деления, или остатка от деления целочисленных аргументов.

выражение1 : выражение2
Оператор ``:'' сопоставляет выражение1 с выражение2, которое должно быть базовым регулярным выражением. Регулярное выражение привязывается к началу строки подразумевающимся ``^''. Если сопоставление проходит удачно и шаблон содержит по крайней мере одно подвыражение ``\(...\)'' регулярного выражения, то воз- вращается строка, соответствующая ``\1''. В противном случае оператор сопоставления возвращает количество соответствующих шаблону символов. Если сопоставление завершается неудачно и шаблон содержит подвыражение регулярного выражения, то возвраща- ется пустая строка. В противном случае возвращается 0.
Круглые скобки используются для группирования в привычной манере.
Утилита expr не делает лексического различия между аргументами, которые могут быть операторами и аргументами, которые могут являться операндами. Операнд, лексически идентичный оператору будет рассматриваться, как синтаксическая ошибка. Смотрите примеры ниже для обходного пути. Синтаксис команды expr в общем является исторически сложившимся и неудобным. В новых приложениях вместо expr рекомендуется использовать арифме- тику командного интерпретатора.

Совместимость с предыдущими реализациями.
 Если не включена совместимость с FreeBSD 4.x, эта версия expr придерживается указаний к синтаксису утилит, определённых в POSIX, которые требуют, чтобы ведущий аргумент, начинающийся со знака минус рассматривался, как опция к программе. Стандартная синтаксическая структура - может быть использована для предотвращения такой обработки. Тем не менее, многие из ранних версий expr, включая ту, что была в предыдущих версиях FreeBSD, не разрешали использовать данный синтаксис. Смотрите ниже примеры переносимых способов для гарантирования корректной интерпретации. Чтобы опреде- лить, должен ли быть активирован режим совместимости, используется функция check_utility_compat(3) (где в качестве аргумента utility использу- ется ``expr''). Эта возможность предназначена для использования в каче- стве вспомогательного средства при переносе и отладке, когда expr используется в сложных сценариях, которые не могут быть легко переделаны так, чтобы избежать использования непереносимых конструкций. Включение режима совместимости также косвенно активирует опцию -e, так как это соответ- ствует историческому поведению expr во FreeBSD. По историческим причи- нам, установка переменной окружения EXPR_COMPAT также включает режим сов- местимости.

ОКРУЖЕНИЕ
EXPR_COMPAT Если переменная определена, включить режим совместимости.

СТАТУС ЗАВЕРШЕНИЯ
Утилита expr завершается с одним из следующих статусов:
0 Выражение не является ни пустой строкой, ни нулём.
1 Выражение является пустой строкой или нулём.
2 Выражение некорректно.

ПРИМЕРЫ
XYZ В
следующем примере (используется синтаксис sh(1)) добавляется единица к переменной a:
a=$(expr $a + 1)

XYZ      Эта команда не выполнится, если значение a является отрицательным числом. Чтобы предотвратить обработку отрицательных значений a в качестве опций команде  expr можно преобразовать выражение так: a=$(expr 1 + $a)
XYZ       В общем случае, заключайте в скобки возможные отрицательные значения: a=$(expr \( $a \) + 1) XYZ       В этом примере выводится имя файла, вычлененного из пути, хранящегося в переменной a. Так как a может содержать путь /, то необходимо предотвратить его обработку в качестве оператора деления. Пара символов // разрешает эту неоднозначность. expr "//$a" : '.*/\(.*\)'
В следующих примерах выводится количество символов в переменной a. И снова, если a может начинаться с дефиса, то необходимо предотвратить его обработку в качестве опции к expr.
XYZ        Если команда expr удовлетворяет стандарту IEEE Std 1003.1-2001 (``POSIX.1''), то сделать это просто: expr -- "$a" : ".*"
XYZ        Для переносимости на более старые системы требуется более сложная команда: expr \( "X$a" : ".*" \) - 1

СМОТРИ ТАКЖЕ
sh(1), test(1), check_utility_compat(3) СТАНДАРТЫ Утилита expr соответствует стандарту IEEE Std 1003.1-2001 (``POSIX.1''), если не активирован режим совместимости.Флаг -e является расширением стандарта.