### 导读 数值计算并非 zsh 的强项,但应付一些简单的场景还是没问题的。并且 zsh 提供一个数值计算库,里边有一些比较常用的数学函数。 ### 整数和浮点数类型 Zsh 中通常不用指定变量类型,但也可以指定。对数值计算来说,区分整数和浮点数是很重要的,不指定变量类型会带来不方便。 ```zsh # 整数 % integer i=123 # (t) 用于输出变量类型 % echo ${(t)i} integer # 浮点数 % float f=123.456 % echo ${(t)f} float # 注意一旦指定了变量类型,类型就不会变了,除非再重新指定其他类型,或者用 unset 删除掉 # 如果把浮点数赋值给整数变量,会取整 % i=12.34 % echo $i 12 % a=-12.34 % echo $a -12 # 整数是 64 位的带符号整数(在 32 位系统下也是) % echo $((-2 ** 63)) $((2 ** 63 - 1)) -9223372036854775808 9223372036854775807 # 浮点数是 64 位带符号浮点数(在 32 位系统下也是) % echo $((-1.79e-308)) $((1.79e308)) -1.79e-308 1.79e+308 ``` ### 运算符 数值计算主要是在 `(( ))` 或者 `$(( ))` 中进行的,在 `$[ ]` 或者 `$var[ ]`(可用于数组索引的计算)中也能进行一部分,这里统一使用小括号。 ```zsh % integer i=123 % float f=123.456 # $(( )) 会计算后返回数值 % echo $((i*f)) 15185.088 # (( )) 用于判断数值比较的结果 % ((i < f && i + 1 > f)) && echo good # 在 (( )) 中也可以给变量赋值 # (( )) 中的语法类似 c 语言,变量名前不需要 $,等号两边可以有空格 % float result % ((result = i / f)) % echo $result 9.963063764e-01 ``` 运算符列表: | 运算符 | 功能 | 样例 | | -------------------------------------------------------------------------- | ------------------------------ | ------------------------------- | | `+` `-` `*` `/` | 四则运算 | 1 + 2 \* 3 / 4 | | `**` | 乘方 | 3 \*\* 3.5 | | `%` | 取余 | 5 % 3 | | `++` `--` | 自增、自减 | i++(返回 i) ++i(返回 i + 1) | | `&` \| `^` | 按位与、按位或、按位异或 | 11 & 13 | | `~` | 按位取反 | ~15 | | `<<` `>>` | 按位左移、按位右移 | 1 << 3 | | `<` `<=` `>` `>=` | 大小比较 | 2 <= 4 | | `==` `!=` | 相等比较 | 2 != 4 | | `&&` \|\| | 逻辑与、逻辑或 | 2 <= 4 && 1 != 3 \|\| 5 > 0 | | `!` | 逻辑非 | ! 1 > 2 | | `^^` | 逻辑异或(两个中只有一个为真) | 1 > 0 ^^ 1 < 0 | | `=` | 赋值 | i = 10 | | `+=` `-=` `*=` `/=` `%=` `**=` `&=` `^=` \|= `<<=` `>>=` `&&=` `^^=` \|\|= | 复合赋值 | i += 10 | | `( )` | 调整优先级 | (1 + 2 ) \* 3 | | `? :` | 三元运算符 | 1 > 2 ? 100 : 200 | | `,` | 逗号运算符(只返回后者) | 40, 20 == 20 | 运算符的优先级和其他编程语言的差不多,不列出了,如果不确定可以加小括号。这部分内容和 c、java、javascript 等语言基本一致。 ### 数学函数 Zsh 包含了一个数学模块,如果需要使用数学函数,需要先加载 `zsh/mathfunc` 模块。 ```zsh % zmodload -i zsh/mathfunc % echo $((sin(0) + ceil(14.4))) 15.0 ``` 函数列表: | 函数名 | 功能 | | -------- | ------------ | | `abs` | 求绝对值 | | `ceil` | 向上取整 | | `floor` | 向下取整 | | `int` | 截断取整 | | `float` | 转换成浮点数 | | `sqrt` | 开平方 | | `cbrt` | 开立方 | | `log` | 自然对数 | | `log10` | 常用对数 | | `rand48` | 随机数 | 更多函数: `acos`、`acosh`、`asin`、`asinh`、`atan`、`atanh`、`cos`、`cosh`、`erf`、`erfc`、`exp`、 `expm1`、`fabs`、`gamma`、`j0`、`j1`、`lgamma`、`log1p`、`logb`、`sin`、`sinh`、`tan`、 `tanh`、`y0`、`y1`、`ilogb`、`signgam`、`copysign`、`fmod`、`hypot`、`nextafter`、`jn`、 `yn`、`ldexp`、`scalb` ### 参考 http://www.bash2zsh.com/zsh_refcard/refcard.pdf