.Dd 2015-10-08
.Dt EXPR 1
.Os sbase
.Sh NAME
.Nm expr
.Nd evaluate expression
.Sh SYNOPSIS
.Nm
.Ar expression
.Sh DESCRIPTION
.Nm
evaluates
.Ar expression
and writes the result to stdout.
.Pp
There are two elemental expressions,
.Sy integer
and
.Sy string.
Let
.Sy expr
be a non-elemental expression and
.Sy expr1 ,
.Sy expr2
arbitrary expressions. Then
.Sy expr
has the recursive form
.Sy expr = [(] expr1 operand expr2 [)].
.Pp
With
.Sy operand
being in order of increasing precedence:
.Bl -tag -width Ds
.It |
Evaluate to
.Sy expr1
if it is neither an empty string nor 0; otherwise evaluate to
.Sy expr2 .
.It &
Evaluate to
.Sy expr1
if
.Sy expr1
and
.Sy expr2
are neither empty strings nor 0; otherwise evaluate to 0.
.It = > >= < <= !=
If
.Sy expr1
and
.Sy expr2
are integers, evaluate to 1 if the relation is true and 0 if it is false.
If
.Sy expr1
and
.Sy expr2
are strings, apply the relation to the return value of
.Xr strcmp 3 .
.It + -
If
.Sy expr1
and
.Sy expr2
are integers, evaluate to their sum or subtraction.
.It * / %
If
.Sy expr1
and
.Sy expr2
are integers, evaluate to their multiplication, division or remainder.
.It :
Evaluate to the number of characters matched in
.Sy expr1
against
.Sy expr2 . expr2
is anchored with an implicit '^'.
.Pp
You can't directly match the empty string, since zero matched characters
resolve equally to a failed match. To work around this limitation, use
"expr X'' : 'X$' instead of "expr '' : '$'"
.El
.Sh EXIT STATUS
.Bl -tag -width Ds
.It 0
.Ar expression
is neither an empty string nor 0.
.It 1
.Ar expression
is an empty string or 0.
.It 2
.Ar expression
is invalid.
.It > 2
An error occurred.
.El
.Sh SEE ALSO
.Xr test 1
.Sh STANDARDS
The
.Nm
utility is compliant with the
.St -p1003.1-2013
specification.