home | O'Reilly's CD bookshelfs | FreeBSD | Linux | Cisco | Cisco Exam

## expr

```expr ``` arg1 operator arg2 [ operator arg3 ... ]

Evaluate arguments as expressions and print the result. Strings can be compared and searched. Arguments and operators must be separated by spaces. In most 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 for expr is 0 (expression is nonzero and nonnull), 1 (expression is 0 or null), or 2 (expression is invalid).

expr is typically used in shell scripts to perform simple mathematics, such as addition or subtraction. It is made obsolete in the Korn shell by that program's built-in arithmetic capabilities.

### Arithmetic Operators

Use the following operators to produce mathematical expressions whose results are printed:

 ```+ ``` Add arg2 to arg1 . ```- ``` Subtract arg2 from arg1 . ```* ``` Multiply the arguments. ```/ ``` Divide arg1 by arg2 . ```% ``` Take the remainder when arg1 is divided by arg2 .

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 single or double quotes).

### Relational Operators

Use relational operators 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, the result is 1; if false, the result is 0. Symbols ```< ``` and ```> ``` must be escaped.

 ```= ``` Are the arguments equal? ```!= ``` Are the arguments different? ```> ``` Is arg1 greater than arg2 ? ```>= ``` Is arg1 greater than or equal to arg2 ? ```< ``` Is arg1 less than arg2 ? ```<= ``` Is arg1 less than or equal to arg2 ?

### Logical Operators

Use logical operators to compare two arguments. Depending on the values, the result can be arg1 (or some portion of it), arg2 , or 0. Symbols ```| ``` and ```& ``` must be escaped.

```| ```

Logical OR; if arg1 has a nonzero (and nonnull) value, the result is arg1 ; otherwise, the result is arg2 .

```& ```

Logical AND; if both arg1 and arg2 have a nonzero (and nonnull) value, the result is arg1 ; otherwise, the result is 0.

:

Similar to grep ; 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 result is the portion of arg1 that matches; otherwise, the result is simply the number of characters that match. By default, a pattern match always applies to the beginning of the first argument (the search string implicitly begins with a ```^ ``` ). To match other parts of the string, start the search string with ```.* ``` .

### Examples

Division happens first; result is 10:

``````expr 5 + 10 / 2
```
```

Addition happens first; result is 7 (truncated from 7.5):

``````expr \( 5 + 10 \) / 2
```
```

Add 1 to variable ```i ``` ; this is how variables are incremented in shell scripts:

``````i=`expr \$i + 1`
```
```

Print 1 (true) if variable ```a ``` is the string "hello":

``````expr \$a = hello
```
```

Print 1 (true) if variable ```b ``` plus 5 equals 10 or more:

``````expr \$b + 5 \>= 10
```
```

In the following examples, variable ```p ``` is the string ```"version.100" ``` . This command prints the number of characters in ```p ``` :

``````expr \$p : '.*'
```
Result is 11
```

Match all characters and print them:

``````expr \$p : '\(.*\)'
```
Result is "version.100"
```

Print the number of lowercase letters at the beginning of ```p ``` :

``````expr \$p : '[a-z]*'
```
Result is 7
```

Match the lowercase letters at the beginning of ```p ``` :

``````expr \$p : '\([a-z]*\)'
```
Result is "version"
```

Truncate ```\$x ``` if it contains five or more characters; if not, just print ```\$x ``` . (Logical OR uses the second argument when the first one is 0 or null; i.e., when the match fails.) Double-quoting is a good idea, in case ```\$x ``` contains whitespace characters.

``````expr "\$x" : '\(.....\)' \| "\$x"
```
```

In a shell script, rename files to their first five letters:

``````mv "\$x" `expr "\$x" : '\(.....\)' \| "\$x"
```
````

(To avoid overwriting files with similar names, use ```mv -i ``` .)

 Reference: expand Reference: exstr