Bash中的变量没有数据类型的定义,所以在处理字符串和数值时会带来麻烦。
例如:
使用-eq比较数值,=比较字符串等;
常用的let、expr仅支持整数运算,不支持浮点数计算。要实现浮点数计算,可以使用bc或awk。
一、bc
shell bc支持浮点数,是一个用于数学运算的高级工具。
[root@localhost 桌面]# bc
bc 1.06
Copyright 1991-1994, 1997, 1998, 2000 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.
2+3 回车
5
3.5*2.3 回车
8.0
Ctrl+d 退出
当然bc还支持很多运算符,比如/ * - +。还支持变量,条件比较操作符,逻辑操作符,判断语句和循环语句。
a=1
while(a++<100)
sum+=a
sum
5049
1.设定小数精度,使用参数scale。
[root@localhost ]# echo "scale=5;3/21" | bc
.14285
[root@localhost ]# echo "scale=2;3/21" | bc
.14
2.进制转换,使用参数obase,ibase(表示输出,输入采用什么进制)
[root@localhost ]# william=100;echo "obase=2;$william" | bc
1100100
[root@localhost ]# william=100;echo "obase=10;ibase=2;$william" | bc
4
[root@localhost ]# william=100;echo "obase=10;ibase=5;$william" | bc
25
3.计算平方和平方根
[root@localhost ]# echo "sqrt(100)" | bc
10
[root@localhost ]# echo "10^10" | bc
10000000000
4.浮点数比较
Ver1="1.01"
Ver2="1.02"
if [ `echo "${Ver1}==${Ver2}"|bc` -eq 1 ] ; then
echo -e "v1 == v2\n"
fi
echo "$Ver1 > $Ver2"|bc
0
二、awk
更好的方法,是借助awk强大的函数功能。
1、计算浮点数
n=`awk -v x=2.53 -v y=3.64 'BEGIN {printf "%.2f\n",x/y}'`
echo $n
0.70
或
n=`awk 'BEGIN {x=2.53;y=3.64;printf "%.2f\n",x/y}'`
echo $n
0.70
或
echo '2.53 3.64'|awk '{printf "%.2f\n",$1/$2}'
0.70
2、比较浮点数
echo 123.45 123.44 | awk '{if($1>$2) {printf"%f greater then %f\n",$1,$2} else {printf"%f less then %f\n",$1,$2}}'
123.450000 greater then 123.440000
或
Ver2="1.02"
Ver1="1.01"
echo ${Ver1} ${Ver2} |awk '{if($1>$2){printf("1")}else {printf("0")}}'
if [ `echo ${Ver1} ${Ver2} |awk '{if($1==$2){printf("1")}else {printf("0")}}'` -eq 1 ] ; then
echo -e "v1 == v2 a\n"
fi0
三、其他方法
还可以用支持浮点预算的语言,如perl或python等,放在Bash脚本中运行:
perl -e 'if ($ARGV[0]>$ARGV[1]) { printf "%f greater then %f\n",$ARGV[0],$ARGV[1];} else { printf "%f less then %f\n",$ARGV[0],$ARGV[1];}' 123.45 123.44
123.450000 greater then 123.440000
四、参考文献:
在此感谢原创提供的文献。
https://blog.csdn.net/stormbjm/article/details/19128023
https://www.xuebuyuan.com/3210111.html