我试图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
并打印(十六进制)或(八进制)的echo
ascii 代码来"
解决该问题。\x22
\042
bash -c 'echo -e "I say \x22Hello, World\x22"'
bash -c 'echo -e "I say \042Hello, World\042"'