在编写 bash 脚本的时候,经常会遇到需要计算数学结果的情况,比如需要计算磁盘剩余空间、文件大小、密码到期时间、主机数量、网络带宽等。
今天我们将介绍在 bash 中使用运算符来执行算术运算。
总体来说,bash 中的算术运算符包括以下这些:
运算符描述
+ 加法运算
- 减法运算
* 乘法运算
/ 整除
% 求余
** 幂运算
在bash脚本中执行加法和减法
为了便于演示,我们创建一个名为 addition.sh 的脚本文件,添加两个文件的大小(以字节 byte 为单位),并输出。
为此,大家需要了解 bash 脚本中的参数,还有 cut 以及 du 命令。
du 命令计算文件的大小,其输出包括两列,分别为文件大小和文件名,cut 命令取出其中的第一列(即文件大小);du 命令的输出通过管道重定向传递给 cut 命令。
脚本如下所示:
#!/bin/bashfs1=$(du -b $1 | cut -f1)fs2=$(du -b $2 | cut -f1)echo file size of $1 is: $fs1echo file size of $2 is: $fs2total=$(($fs1 + $fs2))echo total size is: $total在运行上述脚本的时候,需要给出两个文件名作为参数。比如,我们将文件 /etc/passwd 和 /etc/group 作为参数来运行该脚本:
$ ./addition.sh /etc/passwd /etc/groupfile size of /etc/passwd is: 2795file size of /etc/group is: 1065total size is: 3860在 addition.sh 脚本中最重要的一行为:
total=$(($fs1 + $fs2))上面代码使用 运算符 + 将两个数字 fs1 和 fs2 相加。这里需要注意的是,算术表达式需要使用双括号将其括起来:
$((arithmetic-expression))也可以使用减号运算符 - 来进行减法运算。比如,下面的代码,其结果将为 7:
sub=$((10-3))执行乘法和除法
我们创建一个名为 giga2mega.sh 的脚本文件,用于将 gb 转为 mb,如下所示:
#!/bin/bashgiga=$1mega=$(($giga * 1024))echo $giga gb is equal to $mega mb下面我们来执行一下,看看 4gb 相当于多少 mb:
$ ./giga2mega.sh 44 gb is equal to 4096 mb在这里,我们使用了乘法(*)运算符将 gb 数乘以1024,得到等效的兆字节数:
mega=$(($giga * 1024))类似的,将 gb 转为 kb 也是一样的做法:
kilo=$(($giga * 1024 * 1024))除法运算符 / 用于两个数相除,比如下面例子:
div=$((20 / 4))注意,这里是整除,所有的小数部分会丢失。比如,计算 5 除以 2,其结果为 2:
$ div=$((5 / 2))$ echo $div2要实际计算两个数相除的结果(获取十进制的结果),可使用 bc 命令,比如,还是计算 5 除以 2,可参照如下代码:
echo 5/2 | bc -l2.50000000000000000000另外,在其他算术运算符中也可以使用 bc 命令:
使用幂和余数(模)
下面我们使用幂运算符 ** 进行求幂运算。首先创建一个名为 power.sh 的脚本,接受两个数字作为参数:a 和 b,然后计算 a 的 b 次幂,如下代码所示:
#!/bin/basha=$1b=$2result=$((a**b))echo $1^$2=$result我们来运行一下:
$ ./power.sh 2 32^3=8$ ./power.sh 3 23^2=9$ ./power.sh 5 25^2=25$ ./power.sh 4 24^2=16计算余数使用运算符 %,如下所示:
rem=$((17%5))其结果为 2,大家可以运行试一下。
固态锂电池和氢燃料电池产业发展面临困境不同 因势利导各显神通
芯片解密如何助力芯片及电子产品进行专利分析
2019年全球医疗诊断市场的人工智能价值为36,390.02百万美元
增材制造的优势_增材制造的应用
Opera Mobile支持MIPS Based Android平板电脑
如何在bash中使用运算符来执行算术运算
for循环和forEach的差异
高通发布全球领先的Wi-Fi 6E和蓝牙5.2组合
X射线可显示无铅钙钛矿太阳能电池板材料的原位晶体生长
【节能学院】漏电监测在景观喷泉、喷水池的研究与应用
芯片短缺致汽车减产带来的后续影响
d触发器有几个稳态 d触发器和rs触发器的区别
荣耀9什么时候上市最新消息:华为荣耀9发布会时间确定,证件照曝光,配置、设计、价格、代言人早知道
AMAZFIT新品将大面积使用陶瓷材质 价格可能会在2000元以内
通信协议中的HTTP、TCP、UDP你了解多少(上)
中国移动的5G商用进程未能取得绝对领先优势?
区块链可以为中小型企业做点什么
ETHERNET/IP从站转CANOPEN主站连接AB系统的配置方法
基于区块链底层技术而研究开发的ORA游戏项目介绍
交流电动机仿真训练及实际设计电路图解析