home | help
EXPR(1) 		     General Commands Manual			 EXPR(1)

NAME
     expr -- evaluate expression

SYNOPSIS
     expr [-e] expression

DESCRIPTION
     The  expr	utility  evaluates  expression and writes the result on standard
     output.

     All operators and operands must be passed as separate  arguments.	 Several
     of  the  operators  have  special	meaning to command interpreters and must
     therefore be quoted appropriately.  All integer operands are interpreted in
     base 10.

     Arithmetic operations are performed using signed integer math.  If  the  -e
     flag  is  specified,  arithmetic uses the C intmax_t data type (the largest
     integral type available), and expr will detect arithmetic overflow and  re-
     turn  an  error  indication.  If a numeric operand is specified which is so
     large as to overflow conversion to an integer, it is parsed as a string in-
     stead.  If -e is not specified, arithmetic operations and parsing of  inte-
     ger  arguments will overflow silently according to the rules of the C stan-
     dard, using the long data type.

     Operators are listed below in order of increasing precedence; all are left-
     associative.  Operators with equal precedence are grouped within {  }  sym-
     bols.

     expr1 | expr2
	     Return the evaluation of expr1 if it is neither an empty string nor
	     zero; otherwise, returns the evaluation of expr2.

     expr1 & expr2
	     Return  the  evaluation of expr1 if neither expression evaluates to
	     an empty string or zero; otherwise, returns zero.

     expr1 {=, >, >=, <, <=, !=} expr2
	     Return the results of integer comparison if both arguments are  in-
	     tegers;  otherwise,  returns the results of string comparison using
	     the locale-specific collation sequence.  The result of each compar-
	     ison is 1 if the specified relation is true, or 0 if  the	relation
	     is false.

     expr1 {+, -} expr2
	     Return the results of addition or subtraction of integer-valued ar-
	     guments.

     expr1 {*, /, %} expr2
	     Return  the results of multiplication, integer division, or remain-
	     der of integer-valued arguments.

     expr1 : expr2
	     The ":" operator matches expr1 against expr2, which must be a basic
	     regular expression.  The regular expression is anchored to the  be-
	     ginning of the string with an implicit "^".

	     If the match succeeds and the pattern contains at least one regular
	     expression  subexpression	"\(...\)",  the  string corresponding to
	     "\1" is returned; otherwise the matching operator returns the  num-
	     ber of characters matched.  If the match fails and the pattern con-
	     tains  a  regular	expression  subexpression the null string is re-
	     turned; otherwise 0.

     Parentheses are used for grouping in the usual manner.

     The expr utility makes no lexical distinction between arguments  which  may
     be operators and arguments which may be operands.	An operand which is lex-
     ically identical to an operator will be considered a syntax error.  See the
     examples below for a work-around.

     The  syntax  of  the  expr command in general is historic and inconvenient.
     New applications are advised to use shell arithmetic rather than expr.

   Compatibility with previous implementations
     Unless FreeBSD 4.x compatibility is enabled, this version of  expr  adheres
     to  the POSIX Utility Syntax Guidelines, which require that a leading argu-
     ment beginning with a minus sign be considered an option  to  the	program.
     The  standard  --	syntax may be used to prevent this interpretation.  How-
     ever, many historic implementations of expr, including the one in	previous
     versions  of  FreeBSD, will not permit this syntax.  See the examples below
     for portable ways to guarantee the correct interpretation.  The check_util-
     ity_compat(3) function (with a utility argument of "expr") is used  to  de-
     termine  whether compatibility mode should be enabled.  This feature is in-
     tended for use as a transition and debugging aid, when expr is used in com-
     plex scripts which cannot easily be recast to avoid the non-portable usage.
     Enabling compatibility mode also implicitly enables the  -e  option,  since
     this matches the historic behavior of expr in FreeBSD.  For historical rea-
     sons,  defining  the environment variable EXPR_COMPAT also enables compati-
     bility mode.

ENVIRONMENT
     EXPR_COMPAT  If set, enables compatibility mode.

EXAMPLES
     *	 The following example (in sh(1) syntax) adds one to the variable a:
	       a=$(expr $a + 1)

     *	 This will fail if the value of a is a negative number.  To protect neg-
	 ative values of a from being interpreted as options to  the  expr  com-
	 mand, one might rearrange the expression:
	       a=$(expr 1 + $a)

     *	 More generally, parenthesize possibly-negative values:
	       a=$(expr \( $a \) + 1)

     *	 This  example prints the filename portion of a pathname stored in vari-
	 able a.  Since a might represent the path /, it is necessary to prevent
	 it from being interpreted as the division operator.  The //  characters
	 resolve this ambiguity.
	       expr "//$a" : '.*/\(.*\)'

     The  following  examples  output  the  number  of characters in variable a.
     Again, if a might begin with a hyphen, it is necessary to prevent	it  from
     being interpreted as an option to expr.

     *	 If  the expr command conforms to IEEE Std 1003.1-2001 ("POSIX.1"), this
	 is simple:
	       expr -- "$a" : ".*"

     *	 For portability to older systems, however, a more  complicated  command
	 is required:
	       expr \( "X$a" : ".*" \) - 1

DIAGNOSTICS
     The expr utility exits with one of the following values:
     0	     the expression is neither an empty string nor 0.
     1	     the expression is an empty string or 0.
     2	     the expression is invalid.

SEE ALSO
     sh(1), test(1), check_utility_compat(3)

STANDARDS
     The  expr	utility  conforms  to IEEE Std 1003.1-2001 ("POSIX.1"), provided
     that compatibility mode is not enabled.  The -e flag is an extension.

FreeBSD 5.0			  May 10, 2002				 EXPR(1)

home | help