算术求值(ARITHMETIC EVALUATION)
在一定的环境下,shell 允许进行算术表达式的求值 (参见内建命令 let 和 Arithmetic Expansion (算术表达式))。 求值使用固定宽度的整数,不检查是否溢出,但是被零除会被捕获,标记为错误。 操作数及其优先级和聚合程度与 C 语言中相同。下列操作数的列表按照相同 优先级的操作数其级别来分组。列出的级别顺序是优先级递减的。
id++ id--
变量自增/自减 (在后)
++id --id
变量自增/自减 (在前)
- +
(单目的) 取负/取正
! ~
逻辑和位取反
乘幂
* / %
乘,除,取余
+ -
加,减
<< >>
左/右位移
<= >= < >
比较
== !=
相等/不等
&
位与 (AND)
^
位异或 (exclusive OR)
|
位或 (OR)
&&
逻辑与 (AND)
||
逻辑或 (OR)
expr?expr:expr
条件求值
= *= /= %= += -= <<= >>= &= ^= |=
赋值
expr1 , expr2
逗号表达式
shell 变量可以作为操作数;在表达式求值之前会进行参数扩展。 在表达式中,可以用名称引用 shell 变量,不必使用参数扩展的语法。 变量被引用时,其值被作为算术表达式来求值。 shell 变量用于表达式中时,不必启用整数属性。
以 0 为前导的常量被当作八进制数,以 0x 或 0X 作为前导表明是十六进制。 其他情况下,数字的形式是 [base#]n,这里 base 是一个 2 到 64 的十进制数值,作为数字的基数,n 是在这个基数中数字的值。 如果忽略了 base#,将以 10 为基数。大于 10 的数字依次以小写字母, 大写字母,@ 和 表示。如果 _base 小于或等于 36,在表示 10 与 35 之间 的数字时小写字母和大写字母可以互换。
操作符根据优先级顺序进行求值。圆括号中的子表达式被最先求值,可能会 超越上面的优先级规则。