【问题标题】:bash: bc command's evaluation of *bash: bc 命令对 * 的评估
【发布时间】:2013-05-01 09:50:32
【问题描述】:

我在 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: parse error”。

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

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

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

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

【问题讨论】:

  • 尝试在非空目录中运行echo 2 * 3,看看能不能搞定。
  • 这很有趣。但是,我可以使用转义来完成这项工作吗?如果我这样做$(bashcalc $cat_radius \* $cos),我不会有效地调用echo 2 \* 2,它正确地转义了*并且没有列出目录?
  • 问题不在调用点,而在函数中$@的扩展。 jm666 的回答涵盖了它。

标签: bash unix bc


【解决方案1】:

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

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

【讨论】:

  • 你应该在这里正确地双引号所有变量扩展,但牛肉是使用"$@" pro bare $@。
【解决方案2】:

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

改成:

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

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

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

【讨论】:

    【解决方案3】:

    尝试以下方法:

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

    也就是说,通过管道传递给bc (bashcalc),它将进行计算。

    【讨论】:

    • 这是新的。程序bc 大大早于 Bash,所以无论名称代表什么,它肯定不是“Bash 计算器”。 Wikipedia 说它是“基本计算器”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-25
    • 2018-07-26
    • 2017-07-06
    • 1970-01-01
    • 2012-02-25
    • 1970-01-01
    相关资源
    最近更新 更多