Linux/unix不同shell环境下数值运算的处理

网友投稿 1063 2022-09-25

Linux/unix不同shell环境下数值运算的处理

Linux/unix不同shell环境下数值运算的处理

body { background: #ffffff; margin:0px; padding:0px; font-size:12px; overflow:auto; scrollbar-face-color:#fff; scrollbar-highlight-color:#c1c1bb; scrollbar-shadow-color:#c1c1bb; scrollbar-3dlight-color:#ebebe4; scrollbar-arrow-color:#cacab7; scrollbar-track-color:#f4f4f0; scrollbar-darkshadow-color:#ebebe4; word-wrap: break-word; font-family: 'Courier New', Courier, '宋体'; }

在阅读本文前,您需要对变量替换、命令替换和数值替换有一点认识。

阅读完本文,您应该获得解决下列问题的信息:

不同shell(bash,csh,ksh)下如何处理数值的运算 常用来数值运算的命令 关于运算结果精确到几位小数点的问题

运算方式一:$[]

适用范围:只适用于bash,而sh(如solaris的默认shell)、ksh(如IBM AIX的默认shell)、csh都不支持。

注意我们要计算10+2*((3+1)*(5-1)/2)需要机变一下,通过这种方式echo $[10+2*$[$[3+1]*$[5-1]/2]]注意中间不能有空格否则就会被错误解析。

[附注]

运算方式五:关于进制的处理

关于进制:表达和使用不同的进制。数字可以表达为二进制数、十进制数和十六进制数等等,范围从2进制~36进制。 我们用下面的形式实现:$ echo $[8#17]15$ echo $[16#b]11

实际中我们甚至可以计算7进制的一个数6543210的值表示的10进制是多少。echo $[7#6543210]

注意上面的操作只是bash上的小技巧,ksh和csh都不支持。

运算方式二:(())

适用范围:只适用于bash和ksh,不支持csh。

((sum=10+2*((((3+1))*((5-1))/2))));echo $sum;

运算方式三:expr命令适用范围:包括bash、ksh、csh、sh的大部分shell,但有一点要特别注意就是一定要转义shell环境下的特殊字符。

要特别注意:必须对表达式 (Expression) 参数应用以下规则用空格隔开每个项;用 (反斜杠)放在 shell 需要转义的字符前;对包含空格和其他特殊字符的字符串 (字符参与运算) 要用引号括起来;

expr ( 10 + 2 * ( ( 3 + 1 ) * ( 5 - 1 ) / 2 ) )通用的做法是:"(" ")" "|" "!" 和 "*" ">" "<"都需要转义。

更多信息请查看其帮助,man expr

运算方式四:awk命令

适用范围:这种方法是一种机变吧,适用于所有系统中包含了awk命令的shell环境,而且支持的数字函数也很多。

使用awk,由于awk的命令内部使用的是类C的,所以也不用考虑括号会被识别为其它子程序的情况。awk 'BEGIN{sum=10+2*((3+1)*(5-1)/2)} END{print sum}' /dev/null至于awk都支持哪些数学函数,欢迎大家参照我后续的文章。

运算方式六:关于小数的处理bc命令

适用范围:包括bash、ksh、csh、sh的大部分shell。

也许大家都注意到了,上面提到的方式除了使用awk命令以外,运算结果都是被四舍五入过的整数值,但是实际中精确地保留一定位数的小数也很必要,这时我们就要用到bc这个数学工具了。

如果要熟练地使用bc,不只要对bc命令有一定的了解,对于命令替换(Command Substitution)、命令重定向(Input  Redirect & Output  Redirect)也要有清晰的认识。

对于bc命令$ bcscale=4 #计算结果保留到小数点后四位10/2 5.0000obase=16 #计算的结果以十六进制表达ibase=10 #输入的数值被识别为十进制10/25.00017/28.800scale=0 #运算结果为整数17/28quit

这样我们就可以通过bc命令来计算10+2*((3+1)*(5-1)/2)的值了,并且让计算结果精确到小数点后的四位。# echo `echo "scale=4;10+2*((3+1)*(5-1)/2)" | bc `26.0000

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:营销自动化是什么意思?怎么做?(营销自动化属于什么模块)
下一篇:Linux/UNIX不同shell环境下数组的处理
相关文章

 发表评论

暂时没有评论,来抢沙发吧~