我目前的shell是bash,但是
echo '1 2 3 4'| awk '{print $2}'
和
bash -c " echo '1 2 3 4'| awk '{print $2}' "
给出不同的结果。 Os是Linux。第二次发言时出了什么问题?
答案 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
参数的引号,这会导致上面的命令,我们使用'"'"'
在单引号文本中写一个引号。