【问题标题】:"Integer expression expected error" in bcbc 中的“整数表达式预期错误”
【发布时间】:2017-02-24 12:43:49
【问题描述】:

我在这一行得到一个“bc: integer expression expected”:

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

【问题讨论】:

    标签: bash shell unix bc


    【解决方案1】:

    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,如果为假则输出 0。

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

    【讨论】:

    • 请注意,test 命令仍然会失败,因为$numV 是一个浮点数,而 bash 只能处理整数。您必须使用字符串操作(即${numV%.*})或printf$numV 转换为int
    • 呃,你是对的。我只见树木不见森林。
    • ... 或者只使用不带-lbc,您将获得整数... ;) 例如bc -l &lt;&lt;&lt;"10/3"bc &lt;&lt;&lt;"10/3"
    • 我假设 OP 实际上需要浮点值,否则就不需要 bc。 (如果整数没问题,我推荐 SLePort 的答案。)
    【解决方案2】:

    如果预期结果为整数,则不需要bc。您可以改用$(()) 语法:

    numV=$(( ($lastv - $firstv) / $increment + 1 ))
    if [ "$numVtest" -lt "$numV" ] ; then
        numV=$numVtest
    fi
    

    【讨论】:

    • 这取决于除法的结果是预期是整数(但是,这似乎是可能的,或者至少是足够的)还是浮点值。
    【解决方案3】:

    正如chepner's answer 中指出的那样,您的问题是您只需将字符串分配给numV

    您也可以使用少一个操作:如果 bc 计算布尔语句,它会打印 01,并将其映射到 Bash 条件,我们可以将 bc 命令替换包装到 (( )):

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-25
      • 1970-01-01
      相关资源
      最近更新 更多