bash float比较和(standard_in)1:语法错误

时间:2017-11-23 01:42:42

标签: bash shell floating-point comparison bc

我有这段代码,我从第三行获得(standard_in) 1: syntax error

valueInFloat=printf "%.2g" $temp
tempFloat=printf "%.1f" $value2
compare_result=`echo "$tempFloat < $valueInFloat" |bc -l`
if [[ -z $compare_result ]]
then ...

我正在尝试在bash中进行浮点值比较。

请注意,如果我注释掉第三行并放入compare_result=0,则错误就会消失。

2 个答案:

答案 0 :(得分:2)

在某些情况下,printf可以生成bc无法识别的浮点值。具体来说,如:

pax> printf "%.2g\n" 42456456457357357
4.2e+16
pax> echo '4.2e+16 > 1.0' | bc -l
(standard_in) 1: syntax error

我建议你坚持使用%f变体。它将始终根据ISO C标准生成[−]999.999形式,bc将毫无困难(除非您开始进入无穷大或NaN)。 %g变体生成该格式或%e格式[−]9.999e±99,具体取决于请求的值和精度。

另外,你的测试是错误的。如果字符串为空,则-z测试将为true,并且您的字符串将为10,具体取决于比较结果。一个更好的测试是(假设你想在测试是肯定的时候休息:

if [[ ${compare_result} -eq 1 ]]

答案 1 :(得分:1)

$tempFloat$valueInFloat中的任何一个都没有价值。