此命令将打印a.
echo "line1 a b c" | awk '{ print $2 }'
Run Code Online (Sandbox Code Playgroud)
如果我将单引号更改为双引号,就像这样,它将打印整行.
echo "line1 a b c" | awk "{ print $2 }"
Run Code Online (Sandbox Code Playgroud)
为什么?我知道我应该使用单引号,但如果我使用双引号,为什么打印整行?
如果awk命令是单引号,$2则shell不会解释它,而是作为文字字符串传递$2给awk.awk然后print输入字符串中的第二个空格分隔标记,在这种情况下是a.
echo "line1 a b c" | awk '{ print $2 }' # prints the second space-delimited token
> a
Run Code Online (Sandbox Code Playgroud)
如果awk命令是双引号,$2则由shell解释.因为$2为空(在本例中),所以替换空字符串.awk看到一个看起来像的命令awk "{ print }",这是一个打印所有内容的指令.
echo "line1 a b c" | awk '{ print }' # prints all input
> line1 a b c
Run Code Online (Sandbox Code Playgroud)
也可以使用双qotes,并转义$,这将导致$shell不被解释,而是将$2字符串传递给awk.
echo "line1 a b c" | awk "{ print \$2 }" # prints the second space-delimited token
> a
Run Code Online (Sandbox Code Playgroud)