Linux Bash-cawk给出了不同的结果

Linux Bash-cawk给出了不同的结果,linux,bash,shell,awk,Linux,Bash,Shell,Awk,我当前的shell是bash,但是 echo '1 2 3 4'| awk '{print $2}' 及 给出了不同的结果。操作系统是Linux。第二个语句有什么问题?在第二个命令中,$2在被交给awk之前进行评估,该命令给出以下命令: echo "1 2 3 4" | awk "{print }" echo "1 2 3 4" | awk "{print $2 }" 为了避免这种情况,您可以使用以下糟糕的语法: bash -c 'echo "1 2 3 4"| awk '"'"'{pr

我当前的shell是bash,但是

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


给出了不同的结果。操作系统是Linux。第二个语句有什么问题?

在第二个命令中,
$2
在被交给
awk
之前进行评估,该命令给出以下命令:

echo "1 2 3 4" | awk "{print }"
echo "1 2 3 4" | awk "{print $2 }"
为了避免这种情况,您可以使用以下糟糕的语法:

bash -c 'echo "1 2 3 4"| awk '"'"'{print $2}'"'"''
或以下建议的语法:

问题是变量扩展在这里执行了两次:第一次是在计算
bash-c
命令时,第二次是在派生的
bash
进程计算其命令行时

我最初的回答是将命令更改为
bash-c'echo“1234”| awk“{print$2}”
,这确实避免了在当前shell中进行扩展。但是,在派生的
bash
进程中,对以下命令执行了扩展:

echo "1 2 3 4" | awk "{print }"
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
参数的引号,这将导致上面的命令,在该命令中,我们使用
在单引号文本中写入一个引号。

在第二个命令中,
$2
在交给
awk
之前进行计算,这将发出以下命令:

echo "1 2 3 4" | awk "{print }"
echo "1 2 3 4" | awk "{print $2 }"
为了避免这种情况,您可以使用以下糟糕的语法:

bash -c 'echo "1 2 3 4"| awk '"'"'{print $2}'"'"''
或以下建议的语法:

问题是变量扩展在这里执行了两次:第一次是在计算
bash-c
命令时,第二次是在派生的
bash
进程计算其命令行时

我最初的回答是将命令更改为
bash-c'echo“1234”| awk“{print$2}”
,这确实避免了在当前shell中进行扩展。但是,在派生的
bash
进程中,对以下命令执行了扩展:

echo "1 2 3 4" | awk "{print }"
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
参数的引号,这将导致上面的命令,在该命令中,我们使用
“”
在单引号文本中写入单引号。

如何使用here文档

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

bash使用HERE文档怎么样

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


bash我已经考虑过并尝试过了,但还是一样result@RovshanMusayev对不起,你说得对,我应该检查一下我的命令。我将删除这个答案,同时检查出了什么问题。@RovshanMusayev我发现了一个有效的命令,但我非常确定它可以做得更优雅。如果我找到一个答案,我会编辑,或者你可能想等待另一个答案。很好,很有效,谢谢。)在
bash
中,您可以使用
$'echo“1234”| awk\{print$2}\'
。我已经考虑过并尝试过了,但都是一样的result@RovshanMusayev对不起,你说得对,我应该检查一下我的命令。我将删除这个答案,同时检查出了什么问题。@RovshanMusayev我发现了一个有效的命令,但我非常确定它可以做得更优雅。如果我找到一个答案,我会编辑,或者你可能想等待另一个答案。很好,很有效,谢谢。)在
bash
中,您可以使用
$'echo“1 2 3 4”| awk\'{print$2}\''
。是的,这也很有效,非常感谢!比我的解决方案好。我很好奇你对
EOH
的意思(任何字符串都可以使用,通常是对
文件结尾使用EOF
)。编辑:nvm,
我想是herdoc的结尾吧。关于双引号一个字都没有?@user1934428关于anishsane的评论:如果使用
bash-c
提供位置参数(它将以下参数视为命令的位置参数),这将非常重要。在这个特定的例子中,我认为这并不重要。我是说,对于这个例子,bash是要运行的二进制文件,这两种机制将给出相同的输出。您的解决方案更具可读性,因为它不需要引号转义。但是,对于其他一些二进制文件,情况可能并非如此。因此,当您的解决方案适用于这种情况时,OP应该理解另一个解决方案是不同的,对于其他二进制文件,需要该解决方案;不是这个。是的,这个也有用,谢谢!比我的解决方案好。我很好奇你对
EOH
的意思(任何字符串都可以使用,通常是对
文件结尾使用EOF
)。编辑:nvm,
我想是herdoc的结尾吧。关于双引号一个字都没有?@user1934428关于anishsane的评论:如果使用
bash-c
提供位置参数(它将以下参数视为命令的位置参数),这将非常重要。在这个特定的例子中,我认为这并不重要。我是说,对于这个例子,bash是要运行的二进制文件,这两种机制将给出相同的输出。您的解决方案更具可读性,因为它不需要引号转义。但是,对于其他一些二进制文件,情况可能并非如此。因此,当您的解决方案适用于这种情况时,OP应该理解另一个解决方案是不同的,对于其他二进制文件,需要该解决方案;不是这一个。@hek2mgl我觉得你链接为重复的问题的答案不足以回答OP的问题。你怎么会这么想?@hek2mgl另一个问题的公认答案会提示使用单引号保留文字,但是,这不容易适应
bash-c
命令,因为在包含单引号的文本中进行双扩展和编写单引号非常困难。如果我遇到同样的问题,并且被告知只使用单引号,我觉得我会回来问我应该如何做。也许我会先