多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
总第6篇 Bash中的数学运算并不如其他语言般简便,因为Bash把所有变量都视作字符串,所以a=1+2,a并不等于3,而是等于字符串1+2。 为了解决这一问题,有如下几种方案。 ## 运算符[ ] ~~~ a=2 b=3 c=$[a+b] d=$[a-b] e=$[a*b] f=$[a/b] g=$[a%b] ~~~ $符只是取变量值的意思。中括号和里面的表达式可以视作一个变量。在中括号中引用变量可以直接使用变量名,也可以使用$加变量名。比如: `c=$[$a+$b] ` 当然,你可以直接使用字面值: ~~~ c=$[2+3] d=$[2-3] e=$[2*3] f=$[2/3] ~~~ 需要注意的是: - 该运算只支持整数,如果a或者b是小数,则会报错。运算结果是小数的也会自动取整。 - 该运算[ ]的操作符(+-*/)和变量之间可以有空格。即可写作c=$[a + b] ## 运算符(()) 其用法和[ ]类似,注意事项也差不多。 ## expr及其反引用 ### 普通计算 expr是一个外部命令(非Bash本身的命令),所以它是独立与Bash的,同样可以在其他Shell中使用。 ~~~ a=2 b=3 expr $a + $b expr $a - $b expr $a \* $b expr $a / $b expr $a % $b ~~~ 需要注意的是: - 操作符和操作数之间**一定要**有空格间隔 - 操作数(即变量)前必须有$符 - 乘号*,要用反斜杠\进行转义 - 该命令会将计算结果打印到标准输出 - 仅支持整数运算 - 也可以直接使用数字的字面值 expr除了支持以上运算外,还支持其他运算,大家可以自行 man expr来查看。 ### 赋值 那么如何将expr的计算结果赋值给一个变量呢?答案是:反引用。 我在[《变量及其初始化》](http://blog.csdn.net/guodongxiaren/article/details/38402577#t8)一节中介绍过用命令替换初始化的概念了。反引用只是命令替换方式的一种而已。 ~~~ c=`expr $a + $b` ~~~ ## 用bc进行浮点数运算 ### 基本格式 以上我们介绍的各种数值计算方案,不管是shell内部的还是外部的,都有一个问题,那就是不支持小数运算。这应该是shell本身的使用环境所决定的,实际在脚本中进行小数运算的情况可能并不多。 如果我们想进行浮点数的运算该怎么办呢?答案是利用外部工具(或者说命令)bc。bc是一个交互式的计算器。你可以在shell中键入bc来进入bc的命令提示符。但同样bc也支持写入到脚本中来进行数值计算。这需要用到管道,所谓管道就是将前一个命令的标准输出,作为标准输入传递给后面的命令。关于管道的更多概念,在以后讲IO操作的时候会提及。 ~~~ echo '45.36-22.33'|bc ~~~ 单引号双引号,这里无所谓。实现的过程就是将一个数学表达式传递给bc这个计算器。然后bc会将结果打印到标准输出。 ### 设置精度 浮点运算,有一个很重要的概念就是精度。bc这里的精度指的的是小数的位数。在使用bc来进行除法运算的时候,你会发现默认是取整的,即没有小数部分。 比如:echo '2/3'|bc,它输出的是0。因为bc的默认精度是0。你可能会想到的解决方案是:echo '2.0/3'|bc。但是输出结果依旧是0。 其他运算,比如加、减和乘。都会自动取操作数中的最大精度为输出结果的精度。 ~~~ echo '2.0*3.00'|bc echo '2.25+4.5'|bc echo '5.66-7.888'|bc ~~~ 输出结果为: ~~~ 6.00 6.75 -2.228 ~~~ 但是除法不行,你必须手动设置。 ~~~ echo 'scale=3;2/3'|bc .666 ~~~ .666为输出的结果。因为设置了精度scale=3。前导0会被忽略。 bc功能强大,你甚至能直接利用bc来进行进制转换。 ### 进制转换 ![](https://box.kancloud.cn/2016-02-19_56c6cdb37c1e1.jpg) obase为输出的进制,ibase为输入的进制。 ## 自增自减 C类语言中都支持自增自减操作。即a++,b--,c+=2,d-=3这种类型的计算。其含义就不再介绍了。 进行自增自减运算需要注意的有两点: 1. 操作数必须是变量 1. 操作数必须是整数 Bash中要实现这一功能需要借助命令***let***(内部命令)。 ![](https://box.kancloud.cn/2016-02-19_56c6cdb38e8a0.jpg) 本系列(玩转Bash脚本)更多文章,请访问:[http://blog.csdn.net/column/details/wanbash.html](http://blog.csdn.net/column/details/wanbash.html)