2

我在 UNIX 中使用 bc 命令来解析一些数学表达式。我有两个小功能:

function bashcalc {
      echo $@ | bc -l
}

function2 {
      ...
      catMinusMouse=$(bashcalc "$cat_angle - $mouse_angle")
      cos=$(cosine $catMinusMouse)
      val=$(bashcalc "$cat_radius * $cos")   ##PARSE ERROR
      ...
}

当我尝试运行 val 之后的表达式时,我得到了很多“(standard_in)1:解析错误”。

我的第一个想法是星号是问题,所以我试图逃避它。然而,这给了我一个非法字符错误。

解决方案最终删除了所有的空白

   val=$(bashcalc "$cat_radius*$cos")

问题:为什么计算 catMinusMouse(减法运算符周围有空格)有效,而乘法的相同格式无效?

4

3 回答 3

3

您需要转义*或将其括在“引号”中

3 种变体:

#!/bin/bash

function bashcalc {
    echo "$@" | bc -l
}

function2() {
    cat_radius=0.9
    catMinusMouse=0.4

    val=$(bashcalc "$cat_radius" "*" "c($catMinusMouse)")
    echo $val

    #or
    val=$(bashcalc "$cat_radius * c($catMinusMouse)")
    echo $val

    #or
    val=$(bc -l <<EOF
$cat_radius * c($catMinusMouse)
EOF
)
    echo $val
}

function2
于 2013-05-01T10:25:28.070 回答
2

这里真正的问题是你没有$@在你的bashcalc函数中引用。

将其更改为:

function bashcalc {
      echo "$@" | bc -l
}

更好的是,不要使用echo. 将其更改为:

bashcalc() {
    bc -l <<< "$@"
}
于 2013-05-01T10:51:34.010 回答
1

尝试以下方法:

val=$(echo "$cat_radius * $cos"| bc)

也就是说,管道到bc(bashcalc) 它将进行计算。

于 2013-05-01T09:54:19.960 回答