.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.