6.5 Shell 算术运算(Shell Arithmetic)

shell 允许算术表达式作为一个 shell 表达式进行运算,或由复合命令“((”、内建命令 let、或带有“-i”选项的内建命令 declare 进行运算。

运算结果是不带有溢出检查的定长整数,然而除数为 0 时会捕获并标记为一个错误。操作符与其相关的运行优先级顺序和值都与 C 语言相同。下面的操作符列表把相同优先级的操作符分为一组。列表自上至下的优先级是由高到低的。

操作符说明
id++ id变量取值后自加和取值后自减。
++idid变量自加后取值和自减后取值。
+ -一元负号和正号。
! ~逻辑取反与按位取反。
**取幂。
* / %乘法、除法和取余。
+ -加法和减法。
<< >>向左移位和向右移位。
<= >= < >比较。
== !=等于与不等于。
&按位与。
^按位异或。
|按位或。
&&逻辑与。
||逻辑或。
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 之间的值。

会按优先级顺序对操作符进行运算。在小括号中的子表达式会覆盖上文所描述的优先级,先进行运算。