资讯专栏INFORMATION COLUMN

Zsh 开发指南(第七篇 数值计算)

sf190404 / 1659人阅读

摘要:导读数值计算并非的强项,但应付一些简单的场景还是没问题的。并且提供一个数值计算库,里边有一些比较常用的数学函数。对数值计算来说,区分整数和浮点数是很重要的,不指定变量类型会带来不方便。

导读

数值计算并非 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。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/10301.html

相关文章

  • Zsh 开发指南(第十九篇 脚本实例讲解)

    摘要:导读本文将讲解一些比较简单的脚本实例。使用哈希表判断是否重复,删除哈希表里已经有的后续文件。思路建一个哈希表存放汉字与数字的对应关系。如果当前运行进程数达到最大进程并发数,则循环检查哈希表里的进程是否退出。 导读 本文将讲解一些比较简单的 zsh 脚本实例。 实例一:复制一个目录的目录结构 功能: 将一个目录及它下边的所有目录复制到另一个目录中(即创建同名目录),但不复制目录下的其他类...

    khlbat 评论0 收藏0
  • Zsh 开发指南(第十七篇 使用 socket 文件和 TCP 实现进程间通信)

    摘要:导读就像我之前提到的,脚本是可以直接使用文件所使用或者和其他进程通信的。使用方法机器名端口消息机器名可选,如果没有则发到本机,消息可以包含空格总结本文介绍了使用文件或者来实现两个脚本之间通信的方法。 导读 就像我之前提到的,zsh 脚本是可以直接使用 socket 文件(UNIX domain socket 所使用)或者 TCP 和其他进程通信的。如果进程都在本地,用 socket 文...

    kbyyd24 评论0 收藏0
  • 以太坊智能合约开发七篇:智能合约与网页交互

    摘要:原文发表于以太坊智能合约开发第七篇智能合约与网页交互上一篇中,我们通过开发框架快速编译部署了合约。智能合约与网页交互启动脚本修改完了之后,就需要与网页进行整合。 原文发表于:以太坊智能合约开发第七篇:智能合约与网页交互 上一篇中,我们通过truffle开发框架快速编译部署了合约。本篇,我们将来介绍网页如何与智能合约进行交互。 编写网页 首先我们需要编写一个网页。打开 smartcon...

    sherlock221 评论0 收藏0
  • Gradle for Android 七篇( Groovy入门 )

    摘要:通过这一章节,我们将对和进行对比。必须包含一个方法或者变量,并且其被包围,且其前面有修饰。比如这在中看起来很奇怪,但是这在里是合法的。其默认的修饰符是类和方法为,成员变量为。在中,有二个重要的容器分别是和。 这一系列暂不更新,相关技术讨论,请移步微信群,谢谢,希望大家多多支持! showImg(https://segmentfault.com/img/bVtdBU); 这会是一个系列,...

    jayzou 评论0 收藏0
  • SpringBoot非官方教程 | 七篇:SpringBoot开启声明式事务

    摘要:准备阶段以上一篇文章的代码为例子,即整合,上一篇文章是基于注解来实现的数据访问层,这篇文章基于的来实现,并开启声明式事务。创建实体类数据访问层接口层用户减块用户加块,声明事务,并设计一个转账方法,用户减块,用户加块。 springboot开启事务很简单,只需要一个注解@Transactional 就可以了。因为在springboot中已经默认对jpa、jdbc、mybatis开启了事事...

    tyheist 评论0 收藏0

发表评论

0条评论

sf190404

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<