Bash 执行 awk 数学运算的函数(浮点数)

Bash function to do awk math (floating point)

我想创建一个简单的 bash 函数来计算我使用 awk 传递给它的数学。例如:

awkmath()
{
  echo " " | awk '{ print( "''" ) }'
}

awkmath '2' '*' '3'  #Prints 6

到目前为止我还不能让它工作。我得到的不是“6”,而是“2*3”。我知道还有其他方法可以做到这一点。但我很想看看是否有人可以完成这项工作。这似乎是一件简单的事情,但是 bash 解释有点疯狂。

awkmath()
{
  echo " " | awk '{ print  '""'  }'
}
$ awkmath '2' '*' '3'
6

这在 shell 中使用字符串定界符 (") 来避免在构造 awk 命令之前进行通配和分词:

'{print '""' }' -> '{print 2 '"*"' 3}' -> '{print 2 * 3}'

而在构建 awk 命令后,您原来的 * 留在字符串定界符内:

'{print "''" }' -> '{print 2 "'*'" 3}' -> '{print 2 "*" 3}'

事实上,如果在构造 awk 命令之前 * 没有扩展为当前目录中的文件名列表,那么在第二种情况下你会很幸运。

我会使用 bc 而不是 awk:你的数学表达式可以是任意复杂的

math() {
  local out=$(bc -l <<< "$*")
  if [[ -z $out ]]; then
    return 1
  else
    echo "$out"
  fi
}

math '(2+3)' \* '(5-sqrt(9))'

保护 shell

的特殊字符确实让您感到痛苦