.\" -*- nroff -*- .\"- .\" Copyright (c) 1993 Winning Strategies, Inc. .\" All rights reserved. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions .\" are met: .\" 1. Redistributions of source code must retain the above copyright .\" notice, this list of conditions and the following disclaimer. .\" 2. Redistributions in binary form must reproduce the above copyright .\" notice, this list of conditions and the following disclaimer in the .\" documentation and/or other materials provided with the distribution. .\" 3. All advertising materials mentioning features or use of this software .\" must display the following acknowledgement: .\" This product includes software developed by Winning Strategies, Inc. .\" 4. The name of the author may not be used to endorse or promote products .\" derived from this software without specific prior written permission .\" .\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR .\" IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES .\" OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. .\" IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, .\" INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT .\" NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, .\" DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY .\" THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT .\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF .\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. .\" .\" %FreeBSD: src/bin/expr/expr.1,v 1.29 2007/03/04 19:52:07 ru Exp % .\" $FreeBSDru: frdp/doc/ru_RU.KOI8-R/man/man1/expr.1,v 1.2 2007/11/20 13:50:08 ru Exp $ .\" $FreeBSD$ .\" .Dd 12 июля 2004 .Dt EXPR 1 .Os .Sh НАЗВАНИЕ .Nm expr .Nd вычислить выражение .Sh СИНТАКСИС .Nm .Op Fl e .Ar выражение .Sh ОПИСАНИЕ Утилита .Nm вычисляет .Ar выражение и пишет результат в стандартный вывод. .Pp Все операторы и операнды должны передаваться, как отдельные аргументы. Некоторые операторы имеют специальное значение для командных интерпретаторов и, следовательно, должны заключаться в кавычки. Все целочисленные операнды интерпретируются как числа с основанием 10. .Pp Арифметические операции выполняются, используя целочисленную знаковую математику. Если указан флаг .Fl e , арифметика использует тип данных .Vt intmax_t языка C (самый большой целочисленный тип данных), и .Nm сможет обнаружить арифметическое переполнение и вернуть индикатор ошибки. Если указан числовой операнд, являющийся настолько большим, что происходит переполнение при конвертации его в целое число, то он обрабатывается как строка. Если флаг .Fl e не указан, то переполнение в результате арифметических вычислений и синтаксического разбора целочисленных аргументов будет происходить без диагностики и в соответствии с правилами стандарта языка C, используя тип данных .Vt long . .Pp Операторы перечислены ниже в порядке увеличения приоритета. Все они вычисляются слева направо. Операторы с одинаковым приоритетом сгруппированы внутри символов .Ql { и .Ql } . .Bl -tag -width indent .It Ar выражение1 Li | Ar выражение2 Вернуть вычисленное значение выражения .Ar выражение1 , если оно не является ни пустой строкой, ни нулём. Иначе возвращается значение .Ar выражение2 . .It Ar выражение1 Li & Ar выражение2 Вернуть значение выражения .Ar выражение1 , если ни одно из выражений при вычислении не становится равным пустой строке или нулю. В противном случае, возвращается ноль. .It Ar выражение1 Li "{=, >, >=, <, <=, !=}" Ar выражение2 Вернуть результаты целочисленного сравнения, если оба аргумента являются целыми числами. В противном случае возвращает результаты сравнения строк, используя зависящую от региональных настроек последовательность сравнения. Результат каждого сравнения равен 1, если указанное соотношение справедливо, или 0, если соотношение ложно. .It Ar выражение1 Li "{+, -}" Ar выражение2 Вернуть результаты сложения или вычитания целочисленных аргументов. .It Ar выражение1 Li "{*, /, %}" Ar выражение2 Вернуть результаты умножения, целочисленного деления, или остатка от деления целочисленных аргументов. .It Ar выражение1 Li : Ar выражение2 Оператор .Dq Li \&: сопоставляет .Ar выражение1 с .Ar выражение2 , которое должно быть базовым регулярным выражением. Регулярное выражение привязывается к началу строки подразумевающимся .Dq Li ^ . .Pp Если сопоставление проходит удачно и шаблон содержит по крайней мере одно подвыражение .Dq Li "\e(...\e)" регулярного выражения, то возвращается строка, соответствующая .Dq Li \e1 . В противном случае оператор сопоставления возвращает количество соответствующих шаблону символов. Если сопоставление завершается неудачно и шаблон содержит подвыражение регулярного выражения, то возвращается пустая строка. В противном случае возвращается 0. .El .Pp Круглые скобки используются для группирования в привычной манере. .Pp Утилита .Nm не делает лексического различия между аргументами, которые могут быть операторами и аргументами, которые могут являться операндами. Операнд, лексически идентичный оператору будет рассматриваться, как синтаксическая ошибка. Смотрите примеры ниже для обходного пути. .Pp Синтаксис команды .Nm в общем является исторически сложившимся и неудобным. В новых приложениях вместо .Nm рекомендуется использовать арифметику командного интерпретатора. .Ss Совместимость с предыдущими реализациями Если не включена совместимость с .Fx 4.x, эта версия .Nm придерживается указаний к синтаксису утилит, определённых в .Tn POSIX , которые требуют, чтобы ведущий аргумент, начинающийся со знака минус рассматривался, как опция к программе. Стандартная синтаксическая структура .Fl Fl может быть использована для предотвращения такой обработки. Тем не менее, многие из ранних версий .Nm , включая ту, что была в предыдущих версиях .Fx , не разрешали использовать данный синтаксис. Смотрите ниже примеры переносимых способов для гарантирования корректной интерпретации. Чтобы определить, должен ли быть активирован режим совместимости, используется функция .Xr check_utility_compat 3 (где в качестве аргумента .Fa utility используется .Dq Li expr ) . Эта возможность предназначена для использования в качестве вспомогательного средства при переносе и отладке, когда .Nm используется в сложных сценариях, которые не могут быть легко переделаны так, чтобы избежать использования непереносимых конструкций. Включение режима совместимости также косвенно активирует опцию .Fl e , так как это соответствует историческому поведению .Nm во .Fx . По историческим причинам, установка переменной окружения .Ev EXPR_COMPAT также включает режим совместимости. .Sh ОКРУЖЕНИЕ .Bl -tag -width ".Ev EXPR_COMPAT" .It Ev EXPR_COMPAT Если переменная определена, включить режим совместимости. .El .Sh СТАТУС ЗАВЕРШЕНИЯ Утилита .Nm завершается с одним из следующих статусов: .Bl -tag -width indent -compact .It 0 Выражение не является ни пустой строкой, ни нулём. .It 1 Выражение является пустой строкой или нулём. .It 2 Выражение некорректно. .El .Sh ПРИМЕРЫ .Bl -bullet .It В следующем примере (используется синтаксис .Xr sh 1 ) добавляется единица к переменной .Va a : .Dl "a=$(expr $a + 1)" .It Эта команда не выполнится, если значение .Va a является отрицательным числом. Чтобы предотвратить обработку отрицательных значений .Va a в качестве опций команде .Nm можно преобразовать выражение так: .Dl "a=$(expr 1 + $a)" .It В общем случае, заключайте в скобки возможные отрицательные значения: .Dl "a=$(expr \e( $a \e) + 1)" .It В этом примере выводится имя файла, вычлененного из пути, хранящегося в переменной .Va a . Так как .Va a может содержать путь .Pa / , то необходимо предотвратить его обработку в качестве оператора деления. Пара символов .Li // разрешает эту неоднозначность. .Dl "expr \*q//$a\*q \&: '.*/\e(.*\e)'" .El .Pp В следующих примерах выводится количество символов в переменной .Va a . И снова, если .Va a может начинаться с дефиса, то необходимо предотвратить его обработку в качестве опции к .Nm . .Bl -bullet .It Если команда .Nm удовлетворяет стандарту .St -p1003.1-2001 , то сделать это просто: .Dl "expr -- \*q$a\*q \&: \*q.*\*q" .It Для переносимости на более старые системы требуется более сложная команда: .Dl "expr \e( \*qX$a\*q \&: \*q.*\*q \e) - 1" .El .Sh СМОТРИ ТАКЖЕ .Xr sh 1 , .Xr test 1 , .Xr check_utility_compat 3 .Sh СТАНДАРТЫ Утилита .Nm соответствует стандарту .St -p1003.1-2001 , если не активирован режим совместимости. Флаг .Fl e является расширением стандарта.