# Arithmetic expressions

The shell allows arithmetic expressions to be evaluated, as one of the shell expansions or by the `let` builtin.

Evaluation is done in long integers with no check for overflow, though division by 0 is trapped and flagged as an error. The operators and their precedence and associativity are the same as in the C language.

The following list of operators is grouped into levels of equal-precedence operators. The levels are listed in order of decreasing precedence.

`id++ id--`
variable post-increment and post-decrement
`++id --id`
variable pre-increment and pre-decrement
`- +`
unary minus and plus
`! ~`
logical and bitwise negation
`**`
exponentiation
`* / %`
multiplication, division, remainder
`+ -`
`<< >>`
left and right bitwise shifts
`<= >= < >`
comparison
`== !=`
equality and inequality
`&`
bitwise AND
`^`
bitwise exclusive OR
`|`
bitwise OR
`&&`
logical AND
`||`
logical OR
`expr ? expr : expr`
conditional evaluation
`= *= /= %= += -= <<= >>= &= ^= |=`
assignment
`expr1 , expr2`
comma

Shell variables are allowed as operands; parameter expansion is performed before the expression is evaluated. Within an expression, shell variables can also be referenced by name without using the parameter expansion syntax. The value of a variable is evaluated as an arithmetic expression when it is referenced. A shell variable need not have its integer attribute turned on to be used in an expression.

Constants with a leading 0 are interpreted as octal numbers.
Otherwise, numbers take the form [base`#`]n, where base is a decimal number between 2 and 64 representing the arithmetic base, and n is a number in that base. If base`#` is omitted, then base 10 is used. The digits greater than 9 are represented by the lowercase letters, the uppercase letters, `_', and `@', in that order. If base is less than or equal to 36, lowercase and uppercase letters can be used interchangably to represent numbers between 10 and 35.