EXPR(1) Справочник основных команд FreeBSD 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 Выражение некорректно.
ПРИМЕРЫ
В следующем примере (используется синтаксис sh(1)) добавляется еди-
ница к переменной a:
a=$(expr $a + 1)
Эта команда не выполнится, если значение a является отрицательным
числом. Чтобы предотвратить обработку отрицательных значений a в
качестве опций команде expr можно преобразовать выражение так:
a=$(expr 1 + $a)
В общем случае, заключайте в скобки возможные отрицательные значения:
a=$(expr \( $a \) + 1)
В этом примере выводится имя файла, вычлененного из пути, хранящегося
в переменной a. Так как a может содержать путь /, то необходимо
предотвратить его обработку в качестве оператора деления. Пара сим-
волов // разрешает эту неоднозначность.
expr "//$a" : '.*/\(.*\)'
В следующих примерах выводится количество символов в переменной a. И
снова, если a может начинаться с дефиса, то необходимо предотвратить его
обработку в качестве опции к expr.
Если команда expr удовлетворяет стандарту IEEE Std 1003.1-2001
(``POSIX.1''), то сделать это просто:
expr -- "$a" : ".*"
Для переносимости на более старые системы требуется более сложная
команда:
expr \( "X$a" : ".*" \) - 1
СМОТРИ ТАКЖЕ
sh(1), test(1), check_utility_compat(3)
СТАНДАРТЫ
Утилита expr соответствует стандарту IEEE Std 1003.1-2001 (``POSIX.1''),
если не активирован режим совместимости. Флаг -e является расширением
стандарта.
FreeBSD 6.2 12 июля 2004 FreeBSD 6.2
Последние комментарии
15 недель 2 дня назад
39 недель 3 дня назад
2 года 40 недель назад
3 года 10 недель назад
3 года 33 недели назад
3 года 48 недель назад
3 года 48 недель назад
4 года 1 день назад
4 года 11 недель назад
4 года 15 недель назад