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 является расширением стандарта.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *