[英]“Integer expression expected error” in bc
我在这行中得到“ bc:期望整数表达式”:
numV=$numVtest
在运行脚本时。 我该如何解决这个错误?
firstv=1200 #first velocity value
lastv=5000 #last velocity value
increment=200 #velocity increment
numVtest=100 #use to limit number of velocity panels
#otherwise, use very large value (100)
#================================================
# Compute number of velocity panels
numV='bc -l << -END
( ( $lastv - $firstv ) / $increment ) + 1
END'
if [ $numVtest -lt $numV ] ; then
numV=$numVtest
fi
numV
不是数字; 它是一个字符串,看起来像是对bc
的调用,因此不能用作-lt
的参数。 我怀疑您打算在其定义中使用反引号,而不是单引号。
numV=`bc -l << -END
...
`
但是,更好的做法是使用$(...)
进行命令替换,而不使用反引号。
numV=$(bc -l << -END
( ( $lastv - $firstv ) / $increment ) + 1
END
)
if [ "$numVtest" -lt "$numV" ] ; then
numV=$numVtest
fi
下一个问题是-lt
仅适用于整数,而bc
的结果可能是浮点值。 您还需要在bc
内部进行比较。 如果比较为真,则bc
将输出1;如果比较为假,则bc
将输出0。
result=$(bc -l << -END
( ( $lastv - $firstv ) / $increment ) + 1 > $numVtest
END
)
if [ "$result" = 1 ] ; then
numV=$numVtest
fi
如果结果应为整数,则不需要bc
。 您可以改用$(())
语法:
numV=$(( ($lastv - $firstv) / $increment + 1 ))
if [ "$numVtest" -lt "$numV" ] ; then
numV=$numVtest
fi
正如chepner的答案所指出的那样,您的问题是,您只是将一个字符串分配给numV
。
您也可以选择减少一个操作:如果bc评估一个布尔型语句,则输出0
或1
,并将其映射到Bash条件,我们可以将bc命令替换包装到(( ))
:
if (( $(bc -l <<< "$numVtest < ($lastv - $firstv) / $increment + 1") )); then
numV=$numVtest
fi
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.