6.5 Shell 算术运算(Shell Arithmetic)
shell 允许算术表达式作为一个 shell 表达式进行运算,或由复合命令“((”、内建命令 let、或带有“-i”选项的内建命令 declare 进行运算。
运算结果是不带有溢出检查的定长整数,然而除数为 0 时会捕获并标记为一个错误。操作符与其相关的运行优先级顺序和值都与 C 语言相同。下面的操作符列表把相同优先级的操作符分为一组。列表自上至下的优先级是由高到低的。
| 操作符 | 说明 |
|---|---|
| id++ id— | 变量取值后自加和取值后自减。 |
| ++id —id | 变量自加后取值和自减后取值。 |
| + - | 一元负号和正号。 |
| ! ~ | 逻辑取反与按位取反。 |
| ** | 取幂。 |
| * / % | 乘法、除法和取余。 |
| + - | 加法和减法。 |
| << >> | 向左移位和向右移位。 |
| <= >= < > | 比较。 |
| == != | 等于与不等于。 |
| & | 按位与。 |
| ^ | 按位异或。 |
| | | 按位或。 |
| && | 逻辑与。 |
| || | 逻辑或。 |
| expr ? expr : expr | 条件操作符。 |
| = *= /= %= += -= <<= >>= &= ^= |= | 赋值。 |
| expr1 , expr2 | 逗号。 |
可以使用 shell 变量作为操作数;先执行参数扩展,再进行表达式运算。在表达式内部,可以直接引用变量名而不需要将变量名放入参数扩展的语法中。在未使用参数扩展的语法引用一个空变量或未设置的变量时,其值会被认为是 0。当一个变量的值被引用时,或当使用“declare -i”对一个变量进行整数赋值时,该变量值会被当作算术表达式进行运算。一个空值(null)被认为是 0。shell 变量不需要设置其 integer 属性,也能用于表达式。
整数常量遵循 C 语言的定义,不带有后缀和常量字符。由 0 开头的常量会被翻译为八进制数。以“0x”或“0X”开头的会被认为是十六进制数。还可以使用“[base#]n”形式(这里的中括号代表可选)。其中括号中是可选的进制基数,其值是从 2 到 64 的数值,“n”代表该进制的一个数。如果省略了“base#”,则使用十进制。在指定“n”时,如果需要出现一个非数字的值时,则按顺序使用小写字母、大写字母、“@”和“_”来代表大于 9 的数值。如果进制小于或等于 36 时,小写字母和大写字母可以相互代替来表示 10 到 35 之间的值。
会按优先级顺序对操作符进行运算。在小括号中的子表达式会覆盖上文所描述的优先级,先进行运算。