在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