expr is a very handy tool in shell programming, since it provides the ability to evaluate a wide range of arithmetic, logical, and relational expressions. It evaluates its arguments as expressions and prints the result.
Here's the syntax. The [brackets] mean "optional"; don't type the brackets:
expr arg1 operator arg2 [ operator arg3 ... ]
Arguments and operators must be separated by spaces. In many cases, an argument is an integer, typed literally or represented by a shell variable. There are three types of operators: arithmetic, relational, and logical.
Exit status (Section 35.12) values for expr are 0 if the expression evaluates nonzero and non-null, 1 if the expression evaluates to 0 or null, and 2 if the expression is invalid.
Addition and subtraction are evaluated last, unless they are grouped inside parentheses. The symbols *, (, and ) have meaning to the shell, so they must be escaped (preceded by a backslash or enclosed in quotes).
Division happens first; output is 10:
$ expr 5 + 10 / 2
Addition happens first; output is 7 (truncated from 7.5):
$ expr \( 5 + 10 \) / 2
Add 1 to variable i; this is how variables are incremented in Bourne shell scripts:
i=`expr "$i" + 1`
Output 1 (true) if variable a is the string "hello":
$ expr "$a" = hello
Output 1 (true) if variable b plus 5 equals 10 or more:
$ expr "$b" + 5 \>= 10
In the examples below, variable p is the string "version.100". This command returns the number of characters in p:
$ expr "$p" : '.*' Output is 11
Match all characters and print them:
$ expr "$p" : '\(.*\)' Output is "version.100"
Output the number of lowercase letters matched:
$ expr "$p" : '[a-z]*' Output is 7
Match a string of lowercase letters:
$ expr "$p" : '\([a-z]*\)' Output is "version"
Truncate $x if it contains five or more characters; if not, just output $x. (Logical OR uses the second argument when the first one is 0 or null, i.e., when the match fails.)
$ expr "$x" : '\(.....\)' "$x"
Copyright © 2003 O'Reilly & Associates. All rights reserved.