问题:
通过在终端上输入echo "Hello World!"
,我会得到以下回答:dquote>
问题(两部分):
如果使用单引号,终端将返回我期望看到的结果:Hello World!
!
? 我已经尝试过:
使用反斜杠,echo "Hello World\!"
似乎不起作用,我仍然返回dquote>
。我也尝试过寻找有关转义字符和stackoverflow答案的其他答案。他们通常最终会超过我的头。
问题1:您如何逃脱!
?
您可以使用"'!'"
示例:
echo "Hello World"'!'""'!'" I'm there."
结果:
Hello World!! I'm there.
问题2:为什么这里的双引号与单引号不同?
因为!
是默认的“历史记录扩展”字符,并且在双引号内执行了“历史记录扩展”。
Bash手册:
将字符括在单引号(
'
)中会保留引号内每个字符的文字值。即使在单引号前加反斜杠,也不能在单引号之间引起单引号。用双引号引起来的字符(
"
)保留引号内所有字符的文字值,但$
,`
,\
除外,并且在启用历史记录扩展时,!
。字符$
和`
在双引号中保留其特殊含义(请参见Shell Expansions)。仅当反斜杠后面带有以下字符之一时才保留其特殊含义:$
,`
,"
,\
或换行符。在双引号中,将删除反斜杠,后跟这些字符之一。没有特殊含义的反斜杠前面的字符将保持不变。双引号可以在双引号内加上反斜杠。如果启用,将执行历史记录扩展,除非使用反斜杠对双引号中出现的!
进行转义。!
之前的反斜杠未删除。特殊参数
*
和@
在双引号中具有特殊含义(请参见Shell Parameter Expansion)。