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
的特殊字符确实让您感到痛苦
我想创建一个简单的 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
的特殊字符确实让您感到痛苦