## 5.4. Expressions

Expressions are used in `@` (the C shell math operator), `if`, and `while` statements to perform arithmetic, string comparisons, file testing, etc. `exit` and `set` can also specify expressions. Expressions are formed by combining variables and constants with operators that resemble those in the C programming language. Operator precedence is the same as in C. It is easiest to just remember the following precedence rules:

- `* / %`

- `+ -`

- Group all other expressions inside `()` s; parentheses are required if the expression contains `<`, `<`, `&`, or `|`

### 5.4.1. Operators

Operators can be one of the following types.

### 5.4.1.1. Assignment operators

Operator | Description
--- | ---
`=` | Assign value.
`+= -=` | Reassign after addition/subtraction.
`*= /= %=` | Reassign after multiplication/division/remainder.
`&= ^= |=` | Reassign after bitwise AND/XOR/OR.
`++` | Increment.
`--` | Decrement.

### 5.4.1.2. Arithmetic operators

Operator | Description
--- | ---
`* / %` | Multiplication; integer division; modulus (remainder).
`+ -` | Addition; subtraction.

### 5.4.1.3. Bitwise and logical operators

Operator | Description
--- | ---
`~` | Binary inversion (one's complement).
`!` | Logical negation.
`<< >>` | Bitwise left shift; bitwise right shift.
`&` | Bitwise AND.
`^` | Bitwise exclusive OR.
`|` | Bitwise OR.
`&&` | Logical AND (short-circuit).
`||` | Logical OR (short-circuit).
`{` `command` `}` | Return 1 if command is successful; 0 otherwise. Note that this is the opposite of command's normal return code. The `$status` variable may be more practical.

### 5.4.1.4. Comparison operators

Operator | Description
--- | ---
`== !=` | Equality; inequality.
`<= >=` | Less than or equal to; greater than or equal to.
`< >` | Less than; greater than.
`=~` | String on left matches a filename pattern containing `*`, `?`, or `[...]`.
`!~` | String on left does not match a filename pattern containing `*`, `?`, or `[...]`.

### 5.4.1.5. File inquiry operators

Command substitution and filename expansion are performed on file before the test is performed.

Operator | Description
--- | ---
`-d` `file` | The file is a directory.
`-e` `file` | The file exists.
`-f` `file` | The file is a plain file.
`-o` `file` | The user owns the file.
`-r` `file` | The user has read permission.
`-w` `file` | The user has write permission.
`-x` `file` | The user has execute permission.
`-z` `file` | The file has zero size.
`!` | Reverse the sense of any inquiry above.

### 5.4.2. Examples

The following examples show `@` commands and assume `n` = 4.

Expression | Value of $x
--- | ---
`@ x = ($n > 10 || $n < 5)` | 1
`@ x = ($n >= 0 && $n < 3)` | 0
`@ x = ($n << 2)` | 16
`@ x = ($n >> 2)` | 1
`@ x = $n % 2` | 0
`@ x = $n % 3` | 1

The following examples show the first line of `if` or `while` statements.

Expression | Meaning
--- | ---
`while ($#argv != 0)` | While there are arguments ...
`if ($today[1] == "Fri")` | If the first word is “Fri”...
`if ($file !~ *.[zZ])` | If the file doesn't end with `.z` or `.Z` ...
`if ($argv[1] =~ chap?)` | If the first argument is `chap` followed by a single character ...
`if (-f $argv[1])` | If the first argument is a plain file ...
`if (! -d $tmpdir)` | If `$tmpdir` is not a directory ...

Copyright © 2003 O'Reilly & Associates. All rights reserved.