expr
|
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. expr is a standard UNIX utility; the GNU version is on the CD-ROM. |
---|
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 ( 44.7 ) values for expr are 0 if the expression evaluates non-zero and non-null, 1 if the expression evaluates to 0 or null, or 2 if the expression is invalid.
Use these to produce mathematical expressions whose results are printed.
+
-
*
/
%
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).
Use these to compare two arguments. Arguments can also be words, in which case comparisons assume a
<
z and A
<
Z. If the comparison statement is true,
expr
writes 1 to
standard output (
13.1
)
; if false, it writes 0. The symbols
>
and
<
must be escaped.
Use these to compare two arguments. Depending on the values, the result written to standard output can be
arg1
(or some portion of it),
arg2
, or 0. The symbols
|
and
&
must be escaped.
|
Logical OR; if
arg1
has a non-zero (and non-null) value, the output is
arg1
; otherwise, the output is
arg2
.
&
Logical AND; if both
arg1
and
arg2
have a non-zero (and non-null) value, the output is
arg1
; otherwise, the output is 0.
:
Sort of like
grep
(
27.1
)
;
arg2
is a pattern to search for in
arg1
.
arg2
must be a regular expression in this case. If the
arg2
pattern is enclosed in
\( \)
, the output is the portion of
arg1
that matches; otherwise, the output is simply the number of characters that match. A pattern match always applies to the beginning of the argument (the
^
symbol is assumed by default).
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"
- from O'Reilly & Associates' UNIX in a Nutshell (SVR4/Solaris)