问题出在这一行
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
实际上唯一的错误是您在[ ]
内部使用&&
不起作用。
只有[[ ]]
可以包含多个测试条件的&&
。
你可以把&&
放在外面,就像这样
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 )"
您可以去掉"0."并使用 -gt 和 -lt 运算符:
v06="$(echo $v06 | sed 's/0.//')"
v08="$(echo $v08 | sed 's/0.//')"
elif [ $a -gt $v06 -a $a -lt $v08 ];then
如果你真的想使用 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
中),如果您使用像&&
这样的运算符,请在测试中使用双括号。