Answers:
该$(command)
语法将返回的输出command
。在这里,您使用的是非常简单的cat
程序,其唯一的工作就是将所有内容从标准输入(stdin)复制到标准输出(stdout)。由于您是awk
在双引号中运行脚本,因此在脚本运行之前$(cat)
外壳会将其展开,因此它将输出读入其stdin并将其适当地复制到其stdout。然后将其传递到脚本。您可以通过以下方式查看此操作:awk
echo
awk
set -x
$ set -x
$ echo '((3+(2^3)) * 34^2 / 9)-75.89' | awk "BEGIN{ print $(cat) }"
+ echo '((3+(2^3)) * 34^2 / 9)-75.89'
++ cat
+ awk 'BEGIN{ print ((3+(2^3)) * 34^2 / 9)-75.89 }'
1337
因此,awk
实际上正在运行BEGIN{ print ((3+(2^3)) * 34^2 / 9)-75.89 }'
,返回1337。
现在,$*
是一个特殊的shell变量,它可以扩展到给shell脚本提供的所有位置参数(请参阅参考资料man bash
):
* Expands to the positional parameters, starting from one. When the expan‐
sion is not within double quotes, each positional parameter expands to a
separate word. In contexts where it is performed, those words are sub‐
ject to further word splitting and pathname expansion. When the expan‐
sion occurs within double quotes, it expands to a single word with the
value of each parameter separated by the first character of the IFS spe‐
cial variable. That is, "$*" is equivalent to "$1c$2c...", where c is
the first character of the value of the IFS variable. If IFS is unset,
the parameters are separated by spaces. If IFS is null, the parameters
are joined without intervening separators.
但是,此变量在此处为空。因此,awk
脚本变为:
$ echo '((3+(2^3)) * 34^2 / 9)-75.89' | awk "BEGIN{ print $* }"
+ awk 'BEGIN{ print }'
+ echo '((3+(2^3)) * 34^2 / 9)-75.89'
该$*
扩展为空字符串,并且awk
被告知要打印一个空字符串,这就是为什么你没有输出。
您可能只想使用bc
:
$ echo '((3+(2^3)) * 34^2 / 9)-75.89' | bc
1336.11
scale=
(我假设OP希望与leetspeak一起玩),但我找不到办法。在我的系统上bc -l
返回1336.99888888888888888888
。
bc -l
,否则您会得到上面发布的差异(除法的结果已被截断)。