Expressions are used in **@**, **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 but can be remembered as
follows:

`* / %`

`+ -`

Group all other expressions inside ( )'s. Parentheses are required if the expression contains <, >, &, or |.

Operators can be one of the following types:

= | Assign value. |

+= -= | Reassign after addition/subtraction. |

*= /= %= | Reassign after multiplication/division/remainder. |

&= ^= |= | Reassign after bitwise AND/XOR/OR. |

++ | Increment |

- | Decrement. |

* / % | Multiplication; integer division; modulus (remainder). |

+ - | Addition; subtraction. |

~ | Binary inversion (one's complement). |

! | Logical negation. |

< >> | Bitwise left shift; bitwise right shift. |

& | Bitwise AND. |

^ | Bitwise exclusive OR. |

| | Bitwise OR. |

&& | Logical AND. |

|| | Logical OR. |

{ } | Return 1 if command is successful; 0 otherwise.
Note that this is the opposite of |

== != | 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 [...]. |

Command substitution and filename expansion are performed on

before the test is performed.*file*

-d
| The file is a directory. |

-e
| The file exists. |

-f
| The file is a plain file. |

-o
| The user owns the file. |

-r
| The user has read permission. |

-w
| The user has write permission. |

-x
| The user has execute permission. |

-z
| The file has zero size. |

! | Reverse the sense of any inquiry above. |

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 !~ *.[ ]) | If the file doesn't end with |

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... |