![AWK:为什么 $* 在 bash 函数中有效但在管道下无效?](https://linux22.com/image/1162119/AWK%EF%BC%9A%E4%B8%BA%E4%BB%80%E4%B9%88%20%24*%20%E5%9C%A8%20bash%20%E5%87%BD%E6%95%B0%E4%B8%AD%E6%9C%89%E6%95%88%E4%BD%86%E5%9C%A8%E7%AE%A1%E9%81%93%E4%B8%8B%E6%97%A0%E6%95%88%EF%BC%9F.png)
@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