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

简介:
在阅读本文前,您需要对变量替换、命令替换和数值替换有一点认识。
阅读完本文,您应该获得解决下列问题的信息:
  1. 不同shell(bash,csh,ksh)下如何处理数值的运算
  2. 常用来数值运算的命令
  3. 关于运算结果精确到几位小数点的问题
运算方式一:
$[]
适用范围:只适用于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命令
$ bc
scale=4 #计算结果保留到小数点后四位
10/2 
5.0000
obase=16 #计算的结果以十六进制表达
ibase=10 #输入的数值被识别为十进制
10/2
5.000
17/2
8.800
scale=0 #运算结果为整数
17/2
8
quit
这样我们就可以通过bc命令来计算10+2*((3+1)*(5-1)/2)的值了,并且让计算结果精确到小数点后的四位。
# echo `echo "scale=4;10+2*((3+1)*(5-1)/2)" | bc `
26.0000




     本文转自xiaoyuwang 51CTO博客,原文链接:http://blog.51cto.com/wangxiaoyu/197658,如需转载请自行联系原作者

相关文章
|
11天前
|
Web App开发 Java Linux
Linux之Shell基本命令篇
Linux之Shell基本命令篇
Linux之Shell基本命令篇
|
21天前
|
JSON Kubernetes Linux
Linux环境签发CA证书和K8s需要的证书
Linux环境签发CA证书和K8s需要的证书
23 0
|
8天前
|
存储 算法 Linux
【实战项目】网络编程:在Linux环境下基于opencv和socket的人脸识别系统--C++实现
【实战项目】网络编程:在Linux环境下基于opencv和socket的人脸识别系统--C++实现
25 6
|
28天前
|
监控 Shell Linux
【Shell 命令集合 系统管理 】Linux 显示当前登录到系统的用户信息 who命令 使用指南
【Shell 命令集合 系统管理 】Linux 显示当前登录到系统的用户信息 who命令 使用指南
43 1
|
9天前
|
存储 Shell Linux
【攻防世界】unseping (反序列化与Linux bash shell)
【攻防世界】unseping (反序列化与Linux bash shell)
|
12天前
|
Shell Linux
【Linux】12. 模拟实现shell
【Linux】12. 模拟实现shell
27 2
|
18天前
|
Shell Linux
Linux的shell入门教程shell脚本入门教程
Linux的shell入门教程shell脚本入门教程
15 0
|
22天前
|
应用服务中间件 Linux PHP
Linux下安装php环境并且配置Nginx支持php-fpm模块
Linux下安装php环境并且配置Nginx支持php-fpm模块
18 0
|
23天前
|
Java Linux
linux安装jdk环境
linux安装jdk环境
28 0
|
24天前
|
存储 Shell 数据安全/隐私保护
【Shell 编程指南】Shell read命令 (从标准输入读取数值)
【Shell 编程指南】Shell read命令 (从标准输入读取数值)
22 0