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

时间:2012-03-30 08:35:33

标签: linux shell unix

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

我有一些例子,比如

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

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

4 个答案:

答案 0 :(得分:12)

在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期刊上有一个good article关于使用bc的bash中的浮点数学。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

下面的示例适用于bash shell。

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

您可能想要学习shell脚本here

答案 3 :(得分:0)

EDIT。根据对此答案的评论(感谢用户未知 glenn jackman ),似乎在使用bc进行 true / false <时/ em> test,所需的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