Bash -c awk给出了不同的结果

时间:2017-02-06 10:27:58

标签: linux bash shell awk

我目前的shell是bash,但是

echo '1 2 3 4'| awk '{print $2}' 

bash -c " echo '1 2 3 4'| awk '{print $2}' "

给出不同的结果。 Os是Linux。第二次发言时出了什么问题?

2 个答案:

答案 0 :(得分:3)

如何使用HERE文件?

bash <<'EOH'
echo '1 2 3 4'| awk '{print $2}'
EOH

请注意,我已将-c选项删除为bash,并且必须在 EOH 周围引用单引号以避免在shell级别上评估$ 2。

答案 1 :(得分:2)

在第二个命令中,$2在被传递给awk之前会被评估,它会提供以下命令:

echo "1 2 3 4" | awk "{print }"

为避免这种情况,您可以使用这种糟糕的语法:

bash -c 'echo "1 2 3 4"| awk '"'"'{print $2}'"'"''

chepner建议使用此语法:

bash -c $'echo "1 2 3 4" | awk \'{print $2}\''

问题是变量扩展在这里完成了两次:第一次评估bash -c命令时,第二次产生的bash进程评估其命令行。

我的初步答案是将命令更改为bash -c 'echo "1 2 3 4"| awk "{ print $2 }'",这确实避免了当前shell中的扩展。但是,在生成的bash进程中,扩展是在以下命令上执行的:

echo "1 2 3 4" | awk "{print $2 }"

并且$2已扩展为空字符串。

因此我们需要由生成的bash

执行此命令
echo "1 2 3 4" | awk '{print $2 }'

我们需要在当前shell中用单引号括起来:

bash -c 'echo "1 2 3 4" | awk '{print $2 }''

除此之外,awk引号会关闭bash -c参数的引号,这会导致上面的命令,我们使用'"'"'在单引号文本中写一个引号。