awk 是否支持 en eval like construct to 运行 a command by concatenating arguments

Does awk support en eval like construct to run a command by concatenating arguments

这出现在我最近的一个答案中,以实现单独使用 awk 进行简单算术评估的用例。想象一下 this

的一个简单的微不足道的函数
awkf () { awk -v argv="$*" 'BEGIN{ pi=3.14159265359; printf "%5.5f\n", argv }' ; }

显然我打算用它做算术,比如

awkf "1+2"

但是这些并没有产生预期的输出。我最终在 awk 正文的双引号内使用 $* 来实现这一点。虽然它可以工作,但我不想那样做。有没有办法做到这一点来实现结果

awkf () { awk -v argv="$*" 'BEGIN{ pi=3.14159265359; printf "%5.5f\n", 1+2}' ; }
#                                                                      ^^^^ when I pass "1+2"

即做 awkf "1+2" 我希望得到的结果是 3.00000

建议像 bc 这样的其他工具超出了当前问题的范围。只是想知道如何为此使用 awk

您可以将脚本编写为函数

$ function awkf() { awk "BEGIN{print $*}"; }
$ awkf 4/3
1.33333

$ awkf 3 + 4
7

要添加格式,您必须跳引号舞...

$ function awkf() { awk "BEGIN{printf "\"%5.5f\n\"," $*}"; }