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

% 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。


陌辞寒的技术博客
近期主要更新 Vim 相关文字。
1.9k 声望
108 粉丝
0 条评论
推荐阅读
Vim 操作实用案例分析(一):批量在行首或行尾添加内容
我们写代码或者文档时,经常需要在多行的行首或者行尾添加同样的内容,手动一行行操作显然效率很低,做这样的事情有方便的技巧。 案例一 把 {代码...} 改成 {代码...} 注释掉一段代码是非常常用的操作,很多人都...

陌辞寒阅读 8.5k

使用kubeasz部署高可用kubernetes集群
本实验采用kubeasz作为kubernetes环境部署工具,它是一个基于二进制方式部署和利用ansible-playbook实现自动化来快速部署高可用kubernetes集群的工具,详细介绍请查看kubeasz官方。本实验用到的所有虚拟机默认软...

李朝阳4阅读 751

100 行 shell 写个 Docker
在初接触Docker的时候,我们必须要了解的几个概念就是Cgroup、Namespace、RootFs,如果本身对虚拟化的发展没有深入的了解,那么很难对这几个概念有深入的理解,本文的目的就是通过在操作系统中以交互式的方式去理...

vivo互联网技术2阅读 424

linux中用户登录加载配置文件的过程
shell的类型(站在用户登录登录的角度)登录式shell正常通过某终端登录su - USERNAMEsu -l USERNAME非登录式shellsu USERNAME图形终端下打开命令窗口自动执行的shell脚本用户登录时相关的bash配置文件全局配置文件/...

Dabric阅读 5.3k评论 3

在Linux上查看活跃线程数与连接数
现如今,有两种常见的软件资源几乎成了Java后端程序的标配,即线程池与连接池,但这些池化资源非常的重要,一旦不够用了,就会导致程序阻塞、性能低下,所以有时我们需要看看它们的使用情况,以判断这里是否是瓶颈。

扣钉日记3阅读 1k

封面图
9个超有用的 Linux Touch 命令实例讲解
touch 命令用于创建空文件,也用于更改 Linux 系统中现有文件的时间戳。这里更改时间戳意味着更新文件和目录的访问和修改时间。命令语法touch {options} {file}语法选项1) 创建一个空文件touch 命令创建一个空文...

鸠摩智首席音效师1阅读 1.7k

C语言获取服务器mac地址
它的信息保存在结构体struct ifconf中,有可能不止一个。获取到的信息保存在ifc_buf中。第二个逻辑就是根据网卡的名字去获取mac地址,主要用下面的函数完成:

禹鼎侯阅读 3.3k

1.9k 声望
108 粉丝
宣传栏