繁体   English   中英

BC中的“整数表达式预期错误”

[英]“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评估一个布尔型语句,则输出01 ,并将其映射到Bash条件,我们可以将bc命令替换包装到(( ))

if (( $(bc -l <<< "$numVtest < ($lastv - $firstv) / $increment + 1") )); then
    numV=$numVtest
fi

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM