expr — Evaluate arguments as an expression
Format
expr –W expression
Description
The set of arguments passed to expr constitutes an expression to be evaluated. Each command argument is a separate token of the expression. expr writes the result of the expression on the standard output. This command is primarily intended for arithmetic and string manipulation on shell variables.
- Any number that starts with 0x is hexadecimal.
- Any number that starts with 0 is octal.
- Any number that does not start with 0x or 0 is decimal.
- expr1 | expr2
- Results in the value expr1 if expr1 is true; otherwise, it results in the value of expr2.
- expr1 & expr2
- Results in the value of expr1 if both expressions are true; otherwise, it results in 0.
- expr1 <= expr2 | expr1 < expr2 | expr1 = expr2 | expr1 != expr2 | expr1 >= expr2 | expr1 > expr2
- If both expr1 and expr2 are numeric, expr compares them as numbers; otherwise, it compares them as strings. If the comparison is true, the expression results in 1; otherwise, it results in 0.
- expr1 + expr2 | expr1 – expr2
- Performs addition or subtraction on the two expressions. If either expression is not a number, expr exits with an error.
- expr1 * expr2 | expr1 / expr2 | expr1 % expr2
- Performs multiplication, division, or modulus on the two expressions. If either expression is not a number, expr exits with an error.
- expr1 : re | match expr1 re
- matches the regular expression re against expr1 treated as a string. The regular expression is the same as that accepted by ed, except that the match is always anchored—that is, there is an implied leading ^. Therefore, expr does not consider ^ to be a metacharacter. If the regular expression contains \(…\), \) and it matches at least part of expr1, expr results in only that part; if there is no match, expr results in 0. If the regular expression doesn't contain this construct, the result is the number of characters matched. The function match performs the same operation as the colon operator.
- substr expr1 expr2 expr3
- Results in the substring of expr1 starting at position expr2 (origin 1) for the length of expr3.
- index expr1 expr2
- Searches for any of the characters in expr2 in expr1 and results in the offset of any such character (origin 1), or 0 if no such characters are found.
- length expr1
- Results in the length of expr1.
- (expr)
- Groups expressions.
Options
- –W
- Allows the expression to use hexadecimal and octal numbers.
Usage notes
The parser stack depth is limited to 150 levels. Attempting to process extremely complicated expressions may result in an overflow of this stack, causing an error.
Examples
- The example
returns abs.fname=src/fn_abs.c expr $fname : '*_\(.*\)\.c'
- The example
adds 1 to the value of the shell variable a.a='expr $a + 1'
Localization
- LANG
- LC_ALL
- LC_COLLATE
- LC_CTYPE
- LC_MESSAGES
- LC_SYNTAX
- NLSPATH
See Localization for more information.
Exit values
- 0
- The result of expression is true.
- 1
- The result of expression is false.
- 2
- Failure due to any of following:
- Not enough memory.
- Command-line syntax error.
- Too few arguments on the command line.
- Incorrect regular expression.
- Regular expression is too complicated.
- Nonnumeric value found where a number was expected.
Messages
- internal tree error
- Syntax errors or unusual expression complexity make it impossible for expr to evaluate an expression. If an expression has syntax errors, correct them; if not, simplify the expression (perhaps by breaking it into parts).
Portability
POSIX.2, X/Open Portability Guide, UNIX systems.
In the shell, let largely supersedes this command.
match, substr, length, and index are not documented on all UNIX systems, though they do appear to exist. They are extensions of the POSIX standard.
Related information
ed, let, sh, test
See Regular expressions (regexp) for more information about regexp.