xref: /freebsd/bin/expr/expr.1 (revision 9f3cef91087c68f23d917212fc7b88e7c266feef)
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.\"
312a456239SPeter Wemm.\" $FreeBSD$
32c9fe00dcSJ.T. Conklin.\"
335292d2aeSTim J. Robbins.Dd July 12, 2004
34c9fe00dcSJ.T. Conklin.Dt EXPR 1
35c9fe00dcSJ.T. Conklin.Os
36c9fe00dcSJ.T. Conklin.Sh NAME
37c9fe00dcSJ.T. Conklin.Nm expr
38c9fe00dcSJ.T. Conklin.Nd evaluate expression
39c9fe00dcSJ.T. Conklin.Sh SYNOPSIS
40be8b1497SRuslan Ermilov.Nm
411393277eSGarrett Wollman.Op Fl e
42c9fe00dcSJ.T. Conklin.Ar expression
43c9fe00dcSJ.T. Conklin.Sh DESCRIPTION
44c9fe00dcSJ.T. ConklinThe
4515638d89SPhilippe Charnier.Nm
46c9fe00dcSJ.T. Conklinutility evaluates
47c9fe00dcSJ.T. Conklin.Ar expression
48c9fe00dcSJ.T. Conklinand writes the result on standard output.
49c9fe00dcSJ.T. Conklin.Pp
50f07e4247SGarrett WollmanAll operators and operands must be passed as separate arguments.
51f07e4247SGarrett WollmanSeveral of the operators have special meaning to command interpreters
52f07e4247SGarrett Wollmanand must therefore be quoted appropriately.
531393277eSGarrett WollmanAll integer operands are interpreted in base 10.
54c9fe00dcSJ.T. Conklin.Pp
551393277eSGarrett WollmanArithmetic operations are performed using signed integer math.
561393277eSGarrett WollmanIf the
571393277eSGarrett Wollman.Fl e
581393277eSGarrett Wollmanflag is specified, arithmetic uses the C
599dfcbc3bSRuslan Ermilov.Vt intmax_t
601393277eSGarrett Wollmandata type (the largest integral type available), and
61f07e4247SGarrett Wollman.Nm
621393277eSGarrett Wollmanwill detect arithmetic overflow and return an error indication.
631393277eSGarrett WollmanIf a numeric operand is specified which is so large as to overflow
641393277eSGarrett Wollmanconversion to an integer, it is parsed as a string instead.
651393277eSGarrett WollmanIf
661393277eSGarrett Wollman.Fl e
671393277eSGarrett Wollmanis not specified, arithmetic operations and parsing of integer
681393277eSGarrett Wollmanarguments will overflow silently according to the rules of the C
6994a48596SGarrett Wollmanstandard, using the
709dfcbc3bSRuslan Ermilov.Vt long
711393277eSGarrett Wollmandata type.
72f07e4247SGarrett Wollman.Pp
73f07e4247SGarrett WollmanOperators are listed below in order of increasing precedence; all
74f07e4247SGarrett Wollmanare left-associative.
759f3cef91SRuslan ErmilovOperators with equal precedence are grouped within symbols
769f3cef91SRuslan Ermilov.Ql {
779f3cef91SRuslan Ermilovand
789f3cef91SRuslan Ermilov.Ql } .
79c9fe00dcSJ.T. Conklin.Bl -tag -width indent
80c9fe00dcSJ.T. Conklin.It Ar expr1 Li | Ar expr2
8115638d89SPhilippe CharnierReturn the evaluation of
82c9fe00dcSJ.T. Conklin.Ar expr1
83c9fe00dcSJ.T. Conklinif it is neither an empty string nor zero;
84c9fe00dcSJ.T. Conklinotherwise, returns the evaluation of
85c9fe00dcSJ.T. Conklin.Ar expr2 .
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.
91c9fe00dcSJ.T. Conklin.It Ar expr1 Li "{=, >, >=, <, <=, !=}" 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.
97c9fe00dcSJ.T. Conklin.It Ar expr1 Li "{+, -}" Ar expr2
9815638d89SPhilippe CharnierReturn the results of addition or subtraction of integer-valued arguments.
99c9fe00dcSJ.T. Conklin.It Ar expr1 Li "{*, /, %}" Ar expr2
10015638d89SPhilippe CharnierReturn the results of multiplication, integer division, or remainder of integer-valued arguments.
101c9fe00dcSJ.T. Conklin.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 )
166c9885518SGarrett Wollmanis used to determine whether 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.
171c9885518SGarrett WollmanEnabling compatibility mode
17294a48596SGarrett Wollmanalso implicitly enables the
17394a48596SGarrett Wollman.Fl e
17494a48596SGarrett Wollmanoption, since this matches the historic behavior of
17594a48596SGarrett Wollman.Nm
17694a48596SGarrett Wollmanin
17794a48596SGarrett Wollman.Fx .
178c9885518SGarrett WollmanFor historical reasons, defining the environment variable
179c9885518SGarrett Wollman.Ev EXPR_COMPAT
180c9885518SGarrett Wollmanalso enables compatibility mode.
18196ab7da3SGarrett Wollman.Sh ENVIRONMENT
1829dfcbc3bSRuslan Ermilov.Bl -tag -width ".Ev EXPR_COMPAT"
18396ab7da3SGarrett Wollman.It Ev EXPR_COMPAT
184c9885518SGarrett WollmanIf set, enables compatibility mode.
18596ab7da3SGarrett Wollman.El
1866fca4c7cSRuslan Ermilov.Sh EXIT STATUS
1876fca4c7cSRuslan ErmilovThe
1886fca4c7cSRuslan Ermilov.Nm
1896fca4c7cSRuslan Ermilovutility exits with one of the following values:
1906fca4c7cSRuslan Ermilov.Bl -tag -width indent -compact
1916fca4c7cSRuslan Ermilov.It 0
1926fca4c7cSRuslan Ermilovthe expression is neither an empty string nor 0.
1936fca4c7cSRuslan Ermilov.It 1
1946fca4c7cSRuslan Ermilovthe expression is an empty string or 0.
1956fca4c7cSRuslan Ermilov.It 2
1966fca4c7cSRuslan Ermilovthe expression is invalid.
1976fca4c7cSRuslan Ermilov.El
198c9fe00dcSJ.T. Conklin.Sh EXAMPLES
199f477880aSGarrett Wollman.Bl -bullet
200c9fe00dcSJ.T. Conklin.It
201f07e4247SGarrett WollmanThe following example (in
202f07e4247SGarrett Wollman.Xr sh 1
203f07e4247SGarrett Wollmansyntax) adds one to the variable
204f477880aSGarrett Wollman.Va a :
2059dfcbc3bSRuslan Ermilov.Dl "a=$(expr $a + 1)"
206f477880aSGarrett Wollman.It
207dc2f94a3SGarrett WollmanThis will fail if the value of
208f07e4247SGarrett Wollman.Va a
209f07e4247SGarrett Wollmanis a negative number.
210f07e4247SGarrett WollmanTo protect negative values of
211f07e4247SGarrett Wollman.Va a
212f07e4247SGarrett Wollmanfrom being interpreted as options to the
213f07e4247SGarrett Wollman.Nm
214f07e4247SGarrett Wollmancommand, one might rearrange the expression:
2159dfcbc3bSRuslan Ermilov.Dl "a=$(expr 1 + $a)"
216f477880aSGarrett Wollman.It
217f07e4247SGarrett WollmanMore generally, parenthesize possibly-negative values:
2189dfcbc3bSRuslan Ermilov.Dl "a=$(expr \e( $a \e) + 1)"
219c9fe00dcSJ.T. Conklin.It
2201393277eSGarrett WollmanThis example prints the filename portion of a pathname stored
221f07e4247SGarrett Wollmanin variable
222f07e4247SGarrett Wollman.Va a .
223f07e4247SGarrett WollmanSince
224f07e4247SGarrett Wollman.Va a
225f07e4247SGarrett Wollmanmight represent the path
226f07e4247SGarrett Wollman.Pa / ,
227f07e4247SGarrett Wollmanit is necessary to prevent it from being interpreted as the division operator.
228f07e4247SGarrett WollmanThe
229f07e4247SGarrett Wollman.Li //
230f07e4247SGarrett Wollmancharacters resolve this ambiguity.
2319dfcbc3bSRuslan Ermilov.Dl "expr \*q//$a\*q \&: '.*/\e(.*\e)'"
232f477880aSGarrett Wollman.El
233f477880aSGarrett Wollman.Pp
234f07e4247SGarrett WollmanThe following examples output the number of characters in variable
235f07e4247SGarrett Wollman.Va a .
236f07e4247SGarrett WollmanAgain, if
237f07e4247SGarrett Wollman.Va a
238f07e4247SGarrett Wollmanmight begin with a hyphen, it is necessary to prevent it from being
239f07e4247SGarrett Wollmaninterpreted as an option to
240f07e4247SGarrett Wollman.Nm .
241f477880aSGarrett Wollman.Bl -bullet
242f477880aSGarrett Wollman.It
243f07e4247SGarrett WollmanIf the
244f07e4247SGarrett Wollman.Nm
245f07e4247SGarrett Wollmancommand conforms to
246f07e4247SGarrett Wollman.St -p1003.1-2001 ,
247f07e4247SGarrett Wollmanthis is simple:
2489dfcbc3bSRuslan Ermilov.Dl "expr -- \*q$a\*q \&: \*q.*\*q"
249f477880aSGarrett Wollman.It
250f07e4247SGarrett WollmanFor portability to older systems, however, a more complicated command
251f07e4247SGarrett Wollmanis required:
2529dfcbc3bSRuslan Ermilov.Dl "expr \e( \*qX$a\*q \&: \*q.*\*q \e) - 1"
253c9fe00dcSJ.T. Conklin.El
254e5bf7bf4SJoseph Koshy.Sh SEE ALSO
255e5bf7bf4SJoseph Koshy.Xr sh 1 ,
256c9885518SGarrett Wollman.Xr test 1 ,
257c9885518SGarrett Wollman.Xr check_utility_compat 3
258c9fe00dcSJ.T. Conklin.Sh STANDARDS
259c9fe00dcSJ.T. ConklinThe
26015638d89SPhilippe Charnier.Nm
261d8c21a3eSJ.T. Conklinutility conforms to
26296ab7da3SGarrett Wollman.St -p1003.1-2001 ,
263c9885518SGarrett Wollmanprovided that compatibility mode is not enabled.
2641393277eSGarrett WollmanThe
2651393277eSGarrett Wollman.Fl e
2661393277eSGarrett Wollmanflag is an extension.
267