AWK:为什么 $* 在 bash 函数中有效但在管道下无效?

AWK:为什么 $* 在 bash 函数中有效但在管道下无效?

@terdon 在这个帖子回答了我的相关问题,但我在那篇文章中遗漏了一个问题。

请参考以下命令:

calc(){ awk "BEGIN{ print $* }" ;}; calc "((3+(2^3)) * 34^2 / 9)-75.89"

上述命令运行正常,计算结果为“1337”。

echo '((3+(2^3)) * 34^2 / 9)-75.89' | awk "BEGIN{ print $* }"

但是上述命令没有给出任何结果,而@terdon 很好地解释了原因。

您能否告知为什么第一个例子能够与 $* 一起工作?

答案1

$*指的是位置参数$1- 那些被和等引用的变量$2,并作为脚本和函数的参数提供。这就是你问题的关键。

当你有交互式外壳,默认情况下没有设置位置参数,因此$*为空。如果您通过命令设置这些参数,则可以使其工作set "((3+(2^3)) * 34^2 / 9)-75.89",这将使其$1等于该字符串。

区别在于calc(){ awk "BEGIN{ print $* }" ;};它是一个函数,并且函数可以处理位置参数(它们的,而不是 shell 的)。当你调用时,calc "((3+(2^3)) * 34^2 / 9)-75.89"你正在调用一个带有位置参数的函数"((3+(2^3)) * 34^2 / 9)-75.89"$*不会有空:

$ calc(){ echo "Params: '$*'"; awk "BEGIN{ print $* }" ;}; calc "((3+(2^3)) * 34^2 / 9)-75.89"
Params: '((3+(2^3)) * 34^2 / 9)-75.89'
1337

相关内容