在 bash -c 中显示带 echo 的引号

在 bash -c 中显示带 echo 的引号

我试图I say "Hello, World!"回应bash -c。这是我尝试过的(一些):

$ bash -c "echo I say \"Hello, World"'!'"\""
$ bash -c "echo I say "'"'"Hello, World"'!'"\""
$ bash -c "echo I say """Hello, World"""'!'
$ bash -c $'echo I say \"Hello, World!\"'
$ bash -c 'echo I say "Hello, World!"'

他们都打印

I say Hello, World!

我怎样才能显示报价?

答案1

问题在于您嵌套了引号,这使得引用有些复杂。由于您没有对 的参数进行“全面”引用echo,因此您的所有尝试(除了第三次尝试(1))实际上都是向 传递三个参数echo,这些参数都受报价删除

  • I
  • say
  • Hello, World!

关键点是,在解释“outer”命令时,参数 to 的外部引号将bash -c被删除。内部引号仍然存在,要么是因为它们被转义了,要么是因为它们的类型与外部引号不同。

然后,当bash您显式调用的实例处理该参数(“内部”命令)时,它本身会在解释调用的参数时执行引号删除echo。因此,您所引用的内容Hello, World!将确保这一点被考虑在内的参数echo,但在同一过程中被删除(从而丢失echo)。

由于您不需要在 ("inner")echo命令中进行变量扩展,因此我将使用单引号语法,如下所示:

bash -c 'echo "I say \"Hello, World\"!"'

这样,您就可以将一个参数传递给echo,并且双引号内的引号转义将按预期工作。


(1)在您展示的第三次尝试中,您实际上将 2 个参数传递给bash -c

  • echo I say Hello,
  • World!

导致echo“内部”命令看到的参数。这是因为您尝试“中断”外部双引号的"""方式不起作用 - 相反,这些双引号中的第一个意味着参数的起始双引号bash -c在空格之后关闭。然后,这被视为后面跟着一个空的双引号字符串,然后是一个未引用的 Hello,。所有这些都是串联在一起的,因为它们之间没有空格。

然后,由于后面的空格不受保护,外部bash现在将把剩余部分视为第二个参数,以(再次不带引号)World、双引号空字符串开始,然后是包含 的打开但未闭合的双引号字符串'!'。事实上,它没有正确关闭的事实被您应该收到的有关“未找到事件”的错误消息所掩盖,因为起始双引号使后面的单引号只是一个要打印的字符,因此!没有不再被解释为历史参考。

答案2

如果您不关心 POSIX 合规性,可以通过添加-e并打印(十六进制)或(八进制)的echoascii 代码来"解决该问题。\x22\042

bash -c 'echo -e "I say \x22Hello, World\x22"'

bash -c 'echo -e "I say \042Hello, World\042"'

相关内容