在 bash 中,我如何逃避感叹号?

Mat*_*hew 217 bash syntax escape-characters

我想做类似的事情bzr commit -m "It works!"。我可以通过这样做来逃避感叹号bzr commit -m "It works\!"。但是,我的提交消息包含反斜杠。如何在忽略反斜杠的同时避开感叹号?

Ben*_*ier 193

由于您不依赖 bash 来扩展提交消息中的变量,因此您可以改用单引号。单引号中的字符串不会被 bash 扩展。

bzr commit -m 'This does work!' 
Run Code Online (Sandbox Code Playgroud)

  • 由于问题是“我如何逃避感叹号?” 而不是“我如何不扩展感叹号?” 我不认为这是有效的。有时(例如在同一命令行中传递撇号和感叹号时)这不起作用。下面的答案可以更好地满足许多人的需求。 (28认同)
  • @Jann:你 100% 正确,但我认为问题在于超级用户有很多问题:我们是回答问题的重点,还是帮助人们解决他们的具体问题。我认为这两种方法都有用,这是在特定问题上寻求帮助。 (11认同)

jwd*_*jwd 172

如果您想要双引号和感叹号,这是另一种方法:

echo "It's broken"'!'
Run Code Online (Sandbox Code Playgroud)

即使!不在行尾,这也有效。

例如:

echo "hello there"'!'" and goodbye"
Run Code Online (Sandbox Code Playgroud)

奖励:类似的技术可用于转义Sh 或 Bash 中的任何文本(在 sed 的帮助下):请参阅此答案中的第一个选项。此外,如果您已经bash-completion安装,您可能已经拥有可用quote()功能

  • 不错的提示,JWD。我没有意识到 bash 字符串可以简单地通过省略它们之间的空格来连接。 (4认同)

Den*_*son 73

关闭历史扩展

set +H
Run Code Online (Sandbox Code Playgroud)

或者

set +o histexpand
Run Code Online (Sandbox Code Playgroud)

~/.bashrc如果您通常不使用历史扩展,则可以将这些命令之一添加到您的命令中。

Bash 4.3 添加了一个特例

如果历史扩展字符紧跟在双引号字符串中的结束双引号之前,它也被视为带引号


Kei*_*thB 13

使用单引号 (') 而不是双引号 (")。单引号关闭对其中内容的所有解释,而双引号仅关闭一些。

bzr commit -m 'It works!'
Run Code Online (Sandbox Code Playgroud)