算术求值(ARITHMETIC EVALUATION)

在一定的环境下,shell 允许进行算术表达式的求值 (参见内建命令 letArithmetic 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 之间 的数字时小写字母和大写字母可以互换。

操作符根据优先级顺序进行求值。圆括号中的子表达式被最先求值,可能会 超越上面的优先级规则。