xref: /freebsd/bin/expr/expr.1 (revision fa9896e082a1046ff4fbc75fcba4d18d1f2efc19)
1d8c21a3eSJ.T. Conklin.\" -*- nroff -*-
29ddb49cbSWarner Losh.\"-
3c9fe00dcSJ.T. Conklin.\" Copyright (c) 1993 Winning Strategies, Inc.
4c9fe00dcSJ.T. Conklin.\" All rights reserved.
5c9fe00dcSJ.T. Conklin.\"
6c9fe00dcSJ.T. Conklin.\" Redistribution and use in source and binary forms, with or without
7c9fe00dcSJ.T. Conklin.\" modification, are permitted provided that the following conditions
8c9fe00dcSJ.T. Conklin.\" are met:
9c9fe00dcSJ.T. Conklin.\" 1. Redistributions of source code must retain the above copyright
10c9fe00dcSJ.T. Conklin.\"    notice, this list of conditions and the following disclaimer.
11c9fe00dcSJ.T. Conklin.\" 2. Redistributions in binary form must reproduce the above copyright
12c9fe00dcSJ.T. Conklin.\"    notice, this list of conditions and the following disclaimer in the
13c9fe00dcSJ.T. Conklin.\"    documentation and/or other materials provided with the distribution.
14c9fe00dcSJ.T. Conklin.\" 3. All advertising materials mentioning features or use of this software
15c9fe00dcSJ.T. Conklin.\"    must display the following acknowledgement:
16c9fe00dcSJ.T. Conklin.\"      This product includes software developed by Winning Strategies, Inc.
17c9fe00dcSJ.T. Conklin.\" 4. The name of the author may not be used to endorse or promote products
187d7ee86eSMike Pritchard.\"    derived from this software without specific prior written permission
19c9fe00dcSJ.T. Conklin.\"
20c9fe00dcSJ.T. Conklin.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
21c9fe00dcSJ.T. Conklin.\" IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
22c9fe00dcSJ.T. Conklin.\" OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
23c9fe00dcSJ.T. Conklin.\" IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
24c9fe00dcSJ.T. Conklin.\" INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
25c9fe00dcSJ.T. Conklin.\" NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26c9fe00dcSJ.T. Conklin.\" DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27c9fe00dcSJ.T. Conklin.\" THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28c9fe00dcSJ.T. Conklin.\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
29c9fe00dcSJ.T. Conklin.\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30c9fe00dcSJ.T. Conklin.\"
31*c5ca929fSSevan Janiyan.Dd October 5, 2016
32c9fe00dcSJ.T. Conklin.Dt EXPR 1
33c9fe00dcSJ.T. Conklin.Os
34c9fe00dcSJ.T. Conklin.Sh NAME
35c9fe00dcSJ.T. Conklin.Nm expr
36c9fe00dcSJ.T. Conklin.Nd evaluate expression
37c9fe00dcSJ.T. Conklin.Sh SYNOPSIS
38be8b1497SRuslan Ermilov.Nm
391393277eSGarrett Wollman.Op Fl e
40c9fe00dcSJ.T. Conklin.Ar expression
41c9fe00dcSJ.T. Conklin.Sh DESCRIPTION
42c9fe00dcSJ.T. ConklinThe
4315638d89SPhilippe Charnier.Nm
44c9fe00dcSJ.T. Conklinutility evaluates
45c9fe00dcSJ.T. Conklin.Ar expression
46c9fe00dcSJ.T. Conklinand writes the result on standard output.
47c9fe00dcSJ.T. Conklin.Pp
48f07e4247SGarrett WollmanAll operators and operands must be passed as separate arguments.
49f07e4247SGarrett WollmanSeveral of the operators have special meaning to command interpreters
50f07e4247SGarrett Wollmanand must therefore be quoted appropriately.
51fa717604SStefan EßerAll integer operands are interpreted in base 10 and must consist of only
52fa717604SStefan Eßeran optional leading minus sign followed by one or more digits (unless
533102cfe2SGlen Barberless strict parsing has been enabled for backwards compatibility with
54fa717604SStefan Eßerprior versions of
55f07e4247SGarrett Wollman.Nm
56fa717604SStefan Eßerin
57fa717604SStefan Eßer.Fx ) .
58fa717604SStefan Eßer.Pp
59fa717604SStefan EßerArithmetic operations are performed using signed integer math with a
60fa717604SStefan Eßerrange according to the C
61fa717604SStefan Eßer.Vt intmax_t
62fa717604SStefan Eßerdata type (the largest signed integral type available).
63fa717604SStefan EßerAll conversions and operations are checked for overflow.
64fa717604SStefan EßerOverflow results in program termination with an error message on stdout
65fa717604SStefan Eßerand with an error status.
66fa717604SStefan Eßer.Pp
67fa717604SStefan EßerThe
681393277eSGarrett Wollman.Fl e
69fa717604SStefan Eßeroption enables backwards compatible behaviour as detailed below.
70f07e4247SGarrett Wollman.Pp
71f07e4247SGarrett WollmanOperators are listed below in order of increasing precedence; all
72f07e4247SGarrett Wollmanare left-associative.
739f3cef91SRuslan ErmilovOperators with equal precedence are grouped within symbols
749f3cef91SRuslan Ermilov.Ql {
759f3cef91SRuslan Ermilovand
769f3cef91SRuslan Ermilov.Ql } .
77c9fe00dcSJ.T. Conklin.Bl -tag -width indent
7835471bf8SJoel Dahl.It Ar expr1 Li \&| Ar expr2
7915638d89SPhilippe CharnierReturn the evaluation of
80c9fe00dcSJ.T. Conklin.Ar expr1
81c9fe00dcSJ.T. Conklinif it is neither an empty string nor zero;
82c9fe00dcSJ.T. Conklinotherwise, returns the evaluation of
83fa717604SStefan Eßer.Ar expr2
84fa717604SStefan Eßerif it is not an empty string;
85fa717604SStefan Eßerotherwise, returns zero.
86c9fe00dcSJ.T. Conklin.It Ar expr1 Li & Ar expr2
8715638d89SPhilippe CharnierReturn the evaluation of
88c9fe00dcSJ.T. Conklin.Ar expr1
89c9fe00dcSJ.T. Conklinif neither expression evaluates to an empty string or zero;
90c9fe00dcSJ.T. Conklinotherwise, returns zero.
91ef2a65a8SBaptiste Daroussin.It Ar expr1 Bro =, >, >=, <, <=, != Brc Ar expr2
9215638d89SPhilippe CharnierReturn the results of integer comparison if both arguments are integers;
93d8c21a3eSJ.T. Conklinotherwise, returns the results of string comparison using the locale-specific
94d8c21a3eSJ.T. Conklincollation sequence.
95c9fe00dcSJ.T. ConklinThe result of each comparison is 1 if the specified relation is true,
96c9fe00dcSJ.T. Conklinor 0 if the relation is false.
97ef2a65a8SBaptiste Daroussin.It Ar expr1 Bro +, - Brc Ar expr2
9815638d89SPhilippe CharnierReturn the results of addition or subtraction of integer-valued arguments.
99ef2a65a8SBaptiste Daroussin.It Ar expr1 Bro *, /, % Brc Ar expr2
10015638d89SPhilippe CharnierReturn the results of multiplication, integer division, or remainder of integer-valued arguments.
101dc814fa4SBaptiste Daroussin.It Ar expr1 Li \&: Ar expr2
102c9fe00dcSJ.T. ConklinThe
1039f3cef91SRuslan Ermilov.Dq Li \&:
104c9fe00dcSJ.T. Conklinoperator matches
105c9fe00dcSJ.T. Conklin.Ar expr1
106c9fe00dcSJ.T. Conklinagainst
107c9fe00dcSJ.T. Conklin.Ar expr2 ,
108f07e4247SGarrett Wollmanwhich must be a basic regular expression.
109f07e4247SGarrett WollmanThe regular expression is anchored
1102caac73eSJordan K. Hubbardto the beginning of the string with an implicit
1119f3cef91SRuslan Ermilov.Dq Li ^ .
112c9fe00dcSJ.T. Conklin.Pp
113d8c21a3eSJ.T. ConklinIf the match succeeds and the pattern contains at least one regular
114d8c21a3eSJ.T. Conklinexpression subexpression
1159f3cef91SRuslan Ermilov.Dq Li "\e(...\e)" ,
116c9fe00dcSJ.T. Conklinthe string corresponding to
1179f3cef91SRuslan Ermilov.Dq Li \e1
118c9fe00dcSJ.T. Conklinis returned;
119c9fe00dcSJ.T. Conklinotherwise the matching operator returns the number of characters matched.
120d8c21a3eSJ.T. ConklinIf the match fails and the pattern contains a regular expression subexpression
121d8c21a3eSJ.T. Conklinthe null string is returned;
122d8c21a3eSJ.T. Conklinotherwise 0.
123c9fe00dcSJ.T. Conklin.El
124c9fe00dcSJ.T. Conklin.Pp
125c9fe00dcSJ.T. ConklinParentheses are used for grouping in the usual manner.
126f07e4247SGarrett Wollman.Pp
127c9885518SGarrett WollmanThe
128c9885518SGarrett Wollman.Nm
129c9885518SGarrett Wollmanutility makes no lexical distinction between arguments which may be
130c9885518SGarrett Wollmanoperators and arguments which may be operands.
131c9885518SGarrett WollmanAn operand which is lexically identical to an operator will be considered a
132c9885518SGarrett Wollmansyntax error.
133c9885518SGarrett WollmanSee the examples below for a work-around.
134c9885518SGarrett Wollman.Pp
135c9885518SGarrett WollmanThe syntax of the
136c9885518SGarrett Wollman.Nm
137c9885518SGarrett Wollmancommand in general is historic and inconvenient.
138c9885518SGarrett WollmanNew applications are advised to use shell arithmetic rather than
139c9885518SGarrett Wollman.Nm .
140c9885518SGarrett Wollman.Ss Compatibility with previous implementations
141c9885518SGarrett WollmanUnless
14298d13c7eSRuslan Ermilov.Fx
14398d13c7eSRuslan Ermilov4.x
144c9885518SGarrett Wollmancompatibility is enabled, this version of
145f07e4247SGarrett Wollman.Nm
146f07e4247SGarrett Wollmanadheres to the
147e27480d6SRuslan Ermilov.Tn POSIX
148f07e4247SGarrett WollmanUtility Syntax Guidelines, which require that a leading argument beginning
149f07e4247SGarrett Wollmanwith a minus sign be considered an option to the program.
150f07e4247SGarrett WollmanThe standard
1519dfcbc3bSRuslan Ermilov.Fl Fl
152f07e4247SGarrett Wollmansyntax may be used to prevent this interpretation.
153f07e4247SGarrett WollmanHowever, many historic implementations of
154f07e4247SGarrett Wollman.Nm ,
155f07e4247SGarrett Wollmanincluding the one in previous versions of
156f07e4247SGarrett Wollman.Fx ,
157f07e4247SGarrett Wollmanwill not permit this syntax.
158f07e4247SGarrett WollmanSee the examples below for portable ways to guarantee the correct
159f07e4247SGarrett Wollmaninterpretation.
16094a48596SGarrett WollmanThe
161c9885518SGarrett Wollman.Xr check_utility_compat 3
162c9885518SGarrett Wollmanfunction (with a
163c9885518SGarrett Wollman.Fa utility
164c9885518SGarrett Wollmanargument of
165c9885518SGarrett Wollman.Dq Li expr )
166fa717604SStefan Eßeris used to determine whether backwards compatibility mode should be enabled.
167c9885518SGarrett WollmanThis feature is intended for use as a transition and debugging aid, when
16894a48596SGarrett Wollman.Nm
16994a48596SGarrett Wollmanis used in complex scripts which cannot easily be recast to avoid the
17094a48596SGarrett Wollmannon-portable usage.
171fa717604SStefan EßerEnabling backwards compatibility mode also implicitly enables the
17294a48596SGarrett Wollman.Fl e
17394a48596SGarrett Wollmanoption, since this matches the historic behavior of
17494a48596SGarrett Wollman.Nm
17594a48596SGarrett Wollmanin
176fa717604SStefan Eßer.Fx . This option makes number parsing less strict and permits leading
1779d496f5aSGlen Barberwhite space and an optional leading plus sign.
1789d496f5aSGlen BarberIn addition, empty operands
179fa717604SStefan Eßerhave an implied value of zero in numeric context.
180c9885518SGarrett WollmanFor historical reasons, defining the environment variable
181c9885518SGarrett Wollman.Ev EXPR_COMPAT
182fa717604SStefan Eßeralso enables backwards compatibility mode.
18396ab7da3SGarrett Wollman.Sh ENVIRONMENT
1849dfcbc3bSRuslan Ermilov.Bl -tag -width ".Ev EXPR_COMPAT"
18596ab7da3SGarrett Wollman.It Ev EXPR_COMPAT
186fa717604SStefan EßerIf set, enables backwards compatibility mode.
18796ab7da3SGarrett Wollman.El
1886fca4c7cSRuslan Ermilov.Sh EXIT STATUS
1896fca4c7cSRuslan ErmilovThe
1906fca4c7cSRuslan Ermilov.Nm
1916fca4c7cSRuslan Ermilovutility exits with one of the following values:
1926fca4c7cSRuslan Ermilov.Bl -tag -width indent -compact
1936fca4c7cSRuslan Ermilov.It 0
1946fca4c7cSRuslan Ermilovthe expression is neither an empty string nor 0.
1956fca4c7cSRuslan Ermilov.It 1
1966fca4c7cSRuslan Ermilovthe expression is an empty string or 0.
1976fca4c7cSRuslan Ermilov.It 2
1986fca4c7cSRuslan Ermilovthe expression is invalid.
1996fca4c7cSRuslan Ermilov.El
200c9fe00dcSJ.T. Conklin.Sh EXAMPLES
201f477880aSGarrett Wollman.Bl -bullet
202c9fe00dcSJ.T. Conklin.It
203f07e4247SGarrett WollmanThe following example (in
204f07e4247SGarrett Wollman.Xr sh 1
205f07e4247SGarrett Wollmansyntax) adds one to the variable
206f477880aSGarrett Wollman.Va a :
2079dfcbc3bSRuslan Ermilov.Dl "a=$(expr $a + 1)"
208f477880aSGarrett Wollman.It
209dc2f94a3SGarrett WollmanThis will fail if the value of
210f07e4247SGarrett Wollman.Va a
211f07e4247SGarrett Wollmanis a negative number.
212f07e4247SGarrett WollmanTo protect negative values of
213f07e4247SGarrett Wollman.Va a
214f07e4247SGarrett Wollmanfrom being interpreted as options to the
215f07e4247SGarrett Wollman.Nm
216f07e4247SGarrett Wollmancommand, one might rearrange the expression:
2179dfcbc3bSRuslan Ermilov.Dl "a=$(expr 1 + $a)"
218f477880aSGarrett Wollman.It
219f07e4247SGarrett WollmanMore generally, parenthesize possibly-negative values:
2209dfcbc3bSRuslan Ermilov.Dl "a=$(expr \e( $a \e) + 1)"
221c9fe00dcSJ.T. Conklin.It
222f390d8d9SJilles TjoelkerWith shell arithmetic, no escaping is required:
223f390d8d9SJilles Tjoelker.Dl "a=$((a + 1))"
224f390d8d9SJilles Tjoelker.It
2251393277eSGarrett WollmanThis example prints the filename portion of a pathname stored
226f07e4247SGarrett Wollmanin variable
227f07e4247SGarrett Wollman.Va a .
228f07e4247SGarrett WollmanSince
229f07e4247SGarrett Wollman.Va a
230f07e4247SGarrett Wollmanmight represent the path
231f07e4247SGarrett Wollman.Pa / ,
232f07e4247SGarrett Wollmanit is necessary to prevent it from being interpreted as the division operator.
233f07e4247SGarrett WollmanThe
234f07e4247SGarrett Wollman.Li //
235f07e4247SGarrett Wollmancharacters resolve this ambiguity.
2369dfcbc3bSRuslan Ermilov.Dl "expr \*q//$a\*q \&: '.*/\e(.*\e)'"
237f390d8d9SJilles Tjoelker.It
238f390d8d9SJilles TjoelkerWith modern
239f390d8d9SJilles Tjoelker.Xr sh 1
240f390d8d9SJilles Tjoelkersyntax,
241f390d8d9SJilles Tjoelker.Dl "\*q${a##*/}\*q"
242f390d8d9SJilles Tjoelkerexpands to the same value.
243f477880aSGarrett Wollman.El
244f477880aSGarrett Wollman.Pp
245f07e4247SGarrett WollmanThe following examples output the number of characters in variable
246f07e4247SGarrett Wollman.Va a .
247f07e4247SGarrett WollmanAgain, if
248f07e4247SGarrett Wollman.Va a
249f07e4247SGarrett Wollmanmight begin with a hyphen, it is necessary to prevent it from being
250f07e4247SGarrett Wollmaninterpreted as an option to
251f390d8d9SJilles Tjoelker.Nm ,
252f390d8d9SJilles Tjoelkerand
253f390d8d9SJilles Tjoelker.Va a
254f390d8d9SJilles Tjoelkermight be interpreted as an operator.
255f477880aSGarrett Wollman.Bl -bullet
256f477880aSGarrett Wollman.It
257f390d8d9SJilles TjoelkerTo deal with all of this, a complicated command
258f07e4247SGarrett Wollmanis required:
2599dfcbc3bSRuslan Ermilov.Dl "expr \e( \*qX$a\*q \&: \*q.*\*q \e) - 1"
260f390d8d9SJilles Tjoelker.It
261f390d8d9SJilles TjoelkerWith modern
262f390d8d9SJilles Tjoelker.Xr sh 1
263f390d8d9SJilles Tjoelkersyntax, this can be done much more easily:
264f390d8d9SJilles Tjoelker.Dl "${#a}"
265f390d8d9SJilles Tjoelkerexpands to the required number.
266c9fe00dcSJ.T. Conklin.El
267e5bf7bf4SJoseph Koshy.Sh SEE ALSO
268e5bf7bf4SJoseph Koshy.Xr sh 1 ,
269c9885518SGarrett Wollman.Xr test 1 ,
270c9885518SGarrett Wollman.Xr check_utility_compat 3
271c9fe00dcSJ.T. Conklin.Sh STANDARDS
272c9fe00dcSJ.T. ConklinThe
27315638d89SPhilippe Charnier.Nm
274d8c21a3eSJ.T. Conklinutility conforms to
275fa717604SStefan Eßer.St -p1003.1-2008 ,
276fa717604SStefan Eßerprovided that backwards compatibility mode is not enabled.
277fa717604SStefan Eßer.Pp
278fa717604SStefan EßerBackwards compatibility mode performs less strict checks of numeric arguments:
279fa717604SStefan Eßer.Bl -bullet
280fa717604SStefan Eßer.It
281fa717604SStefan EßerAn empty operand string is interpreted as 0.
282fa717604SStefan Eßer.El
283fa717604SStefan Eßer.Bl -bullet
284fa717604SStefan Eßer.It
285fa717604SStefan EßerLeading white space and/or a plus sign before an otherwise valid positive
2863102cfe2SGlen Barbernumeric operand are allowed and will be ignored.
287fa717604SStefan Eßer.El
288fa717604SStefan Eßer.Pp
289fa717604SStefan EßerThe extended arithmetic range and overflow checks do not conflict with
290fa717604SStefan EßerPOSIX's requirement that arithmetic be done using signed longs, since
291fa717604SStefan Eßerthey only make a difference to the result in cases where using signed
292fa717604SStefan Eßerlongs would give undefined behavior.
293fa717604SStefan Eßer.Pp
294fa717604SStefan EßerAccording to the
295fa717604SStefan Eßer.Tn POSIX
296fa717604SStefan Eßerstandard, the use of string arguments
297fa717604SStefan Eßer.Va length ,
298fa717604SStefan Eßer.Va substr ,
299fa717604SStefan Eßer.Va index ,
300fa717604SStefan Eßeror
301fa717604SStefan Eßer.Va match
3029d496f5aSGlen Barberproduces undefined results.
3039d496f5aSGlen BarberIn this version of
304fa717604SStefan Eßer.Nm ,
305fa717604SStefan Eßerthese arguments are treated just as their respective string values.
306fa717604SStefan Eßer.Pp
3071393277eSGarrett WollmanThe
3081393277eSGarrett Wollman.Fl e
3091393277eSGarrett Wollmanflag is an extension.
310*c5ca929fSSevan Janiyan.Sh HISTORY
311*c5ca929fSSevan JaniyanAn
312*c5ca929fSSevan Janiyan.Nm
313*c5ca929fSSevan Janiyanutility first appeared in the Programmer's Workbench (PWB/UNIX).
314*c5ca929fSSevan JaniyanA public domain version of
315*c5ca929fSSevan Janiyan.Nm
316*c5ca929fSSevan Janiyanwritten by
317*c5ca929fSSevan Janiyan.An Pace Willisson Aq Mt pace@blitz.com
318*c5ca929fSSevan Janiyanappeared in
319*c5ca929fSSevan Janiyan.Bx 386 0.1 .
320*c5ca929fSSevan Janiyan.Sh AUTHORS
321*c5ca929fSSevan JaniyanInitial implementation by
322*c5ca929fSSevan Janiyan.An Pace Willisson Aq Mt pace@blitz.com
323*c5ca929fSSevan Janiyanwas largely rewritten by
324*c5ca929fSSevan Janiyan.An -nosplit
325*c5ca929fSSevan Janiyan.An J.T. Conklin Aq Mt jtc@FreeBSD.org .
326