导读

数值计算并非 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[ ](可用于数组索引的计算)中也能进行一部分,这里统一使用小括号。

% 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

运算符列表。(为了避免表格排版错误,| 替换成了 I。)

运算符 功能 样例
+ - * / 四则运算 1 + 2 * 3 / 4
** 乘方 3 ** 3.5
% 取余 5 % 3
++ -- 自增、自减 i++(返回 i) ++i(返回 i + 1)
& I ^ 按位与、按位或、按位异或 11 & 13
~ 按位取反 ~15
<< >> 按位左移、按位右移 1 << 3
< <= > >= 大小比较 2 <= 4
== != 相等比较 2 != 4
&& II 逻辑与、逻辑或 2 <= 4 && 1 != 3 II 5 > 0
! 逻辑非 ! 1 > 2
^^ 逻辑异或(两个中只有一个为真) 1 > 0 ^^ 1 < 0
= 赋值 i = 10
+= -= = /= %= *= &= ^= I= <<= >>= &&= ^^= II= 复合赋值 i += 10
( ) 调整优先级 (1 + 2 ) * 3
? : 三元运算符 1 > 2 ? 100 : 200
, 逗号运算符(只返回后者) 40, 20 == 20

运算符的优先级和其他编程语言的差不多,不列出了,如果不确定可以加小括号。这部分内容和 c、java、javascript 等语言基本一致。

数学函数

Zsh 包含了一个数学模块,如果需要使用数学函数,需要先加载 zsh/mathfunc 模块。

% 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_r...

本文不再更新,全系列文章在此更新维护:github.com/goreliu/zshguide

付费解决 Windows、Linux、Shell、C、C++、AHK、Python、JavaScript、Lua 等领域相关问题,灵活定价,欢迎咨询,微信 ly50247。


陌辞寒
1.9k 声望108 粉丝