bash测试范围内的数字(带浮点数)

时间:2012-10-18 10:21:35

标签: linux bash shell

问题出在这一行

elif [  "$(echo $a '>' $v06 | bc -l)"  -eq 1  &&   "$(echo $a '<' $v08 | bc -l)" -eq 1  ];then

如何测试数字是否在范围内? 我知道可能还有其他解决办法,但我想以这种方式解决bc ......

a=0.1
v06=0.6
v08=0.8

if [ "$(echo $a '<' $v06 | bc -l)" -eq 1 ];then
    echo " <0.6"
elif [  "$(echo $a '>' $v06 | bc -l)"  -eq 1  &&   "$(echo $a '<' $v08 | bc -l)" -eq 1  ];then
    echo " <0.6 >0.8"
else
    echo ">1.5"
fi

3 个答案:

答案 0 :(得分:2)

实际上,唯一不对的是你在&&[ ]使用了[[ ]]

对于多个测试条件,只有&&可以包含&&

您可以将elif [ "$(echo $a '>' $v06 | bc -l)" -eq 1 ] && [ "$(echo $a '<' $v08 | bc -l)" -eq 1 ]; then 放在外面,就像这样

elif [ $(echo "($a > $v06) && ($a < $v08)" | bc -l) -eq 1 ]; then

甚至更好

bc

因为(num1 > num2) && (num1 < num3)实际上支持$( )符号

p / s:您不需要0周围的引号,因为您只希望1$( )作为返回值

p / s2:你可以在"$(echo "1 + 2" | bc -l )" 内加引号,即使它用引号括起来,例如

{{1}}

答案 1 :(得分:1)

你可以去掉“0”并使用-gt和-lt运算符:

v06="$(echo $v06 | sed 's/0.//')"
v08="$(echo $v08 | sed 's/0.//')"




elif [  $a -gt $v06 -a $a -lt $v08 ];then

答案 2 :(得分:0)

如果你真的想使用bc:

test1=$(bc -l <<< "${a} < ${v06}")
test2=$(bc -l <<< "${a} > ${v06}")
test3=$(bc -l <<< "${a} < ${v08}")
if [[ ${test1} -eq 1 ]]; then
   blabla
elif [[ ${test1} -eq 1 && ${test2} -eq 1 ]]; then 
   blabla
fi

我建议在变量周围使用大括号(因此您确定06和08不会附加到$v),如果您使用&&之类的运算符,请在测试中使用双括号。