bash:bc命令对*的评价

时间:2013-05-01 09:50:32

标签: bash unix bc

我在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(在减法运算符周围有空格)可以工作,而相同的乘法格式不起作用?

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:2)

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

将其更改为:

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

更好,don't use echo。将其更改为:

bashcalc() {
    bc -l <<< "$@"
}

答案 2 :(得分:1)

尝试以下方法:

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

即管道到bc(bashcalc),它将进行计算。