shell脚本中整数和浮点数的比较

shell脚本中,我们如何比较(整数和浮点),(浮点和浮点),(浮点和整数),(整数和整数)只有一个条件。

我有几个例子

set X=3.1 set Y=4.1 if [ $X < $Y ] then echo "wassup" endif 

但是从cron作业运行上面似乎没有工作。

在bash中执行浮点操作的方法是使用几乎所有Linux发行版都可用的bc 。

 # bc will return 0 for false and 1 for true if [ $(echo "23.3 > 7.3" | bc) -ne 0 ] then echo "wassup" fi 

在linux杂志上有一篇关于在bash中使用bc的浮点运算的好文章 。

Bah本身只处理整数。 使用bc:

 echo "$X>$Y" | bc 0 echo "$X<$Y" | bc 1 

你不需要担心规模。 这仅仅是为了预测输出格式:

 X=3.000001 Y=3.0001 echo "$X>$Y" | bc 0 echo "$X<$Y" | bc 1 echo "scale=1;$X<$Y" | bc 1 

下面的例子在bash shell上工作。

  X=3.1 Y=4.1 if [ $X -le $Y ] then echo "wassup" fi 

你可能想在这里学习shell脚本

编辑。 基于对这个答案的评论(感谢用户未知glenn jackman ),似乎在使用bc进行真/假测试时,所需的bash测试只是简单的:

  • (( $(echo "$X < $Y" |bc) )) …查看下面的测试结果和脚本

对于旧式的bash [ ]测试,需要与-ne 0进行比较。


bash本身并不处理浮点数,但是你可以调用一个实用工具如bc

man bc – 任意精确的计算器语言

 X=3.1 Y=4.1 # This test has two superfluous components. # See EDIT (above) and TESTS below if (($(echo "scale=9; $X < $Y" |bc)!=0)) ;then echo "wassup" fi 

检测结果:

 if [ "1" ] true [ "1" ] true if [ "0" ] true [ "0" ] true if [ 1 ] true [ 1 ] true if [ 0 ] true [ 0 ] true if (( "1" )) true (( "1" )) true if (( "0" )) false (( "0" )) false if (( 1 )) true (( 1 )) true if (( 0 )) false (( 0 )) false echo "1<1"|bc true echo "1<0"|bc true 

测试脚本:

 printf 'if [ "1" ] '; if [ "1" ]; then echo true; else echo false; fi printf ' [ "1" ] '; [ "1" ] && echo true || echo false printf 'if [ "0" ] '; if [ "0" ]; then echo true; else echo false; fi printf ' [ "0" ] '; [ "0" ] && echo true || echo false echo printf 'if [ 1 ] '; if [ 1 ]; then echo true; else echo false; fi printf ' [ 1 ] '; [ 1 ] && echo true || echo false printf 'if [ 0 ] '; if [ 0 ]; then echo true; else echo false; fi printf ' [ 0 ] '; [ 0 ] && echo true || echo false echo printf 'if (( "1" )) '; if (("1")); then echo true; else echo false; fi printf ' (( "1" )) '; (("1")) && echo true || echo false printf 'if (( "0" )) '; if (("0")); then echo true; else echo false; fi printf ' (( "0" )) '; (("0")) && echo true || echo false echo printf 'if (( 1 )) '; if (( 1 )); then echo true; else echo false; fi printf ' (( 1 )) '; (( 1 )) && echo true || echo false printf 'if (( 0 )) '; if (( 0 )); then echo true; else echo false; fi printf ' (( 0 )) '; (( 0 )) && echo true || echo false echo printf 'echo "1<1"|bc '; echo "1<1"|bc >/dev/null && echo true || echo false printf 'echo "1<0"|bc '; echo "1<0"|bc >/dev/null && echo true || echo false