在 bash 中,如何转义感叹号?

在 bash 中,如何转义感叹号?

我想做类似的事情bzr commit -m "It works!"。我可以通过执行来转义感叹号bzr commit -m "It works\!"。但是,我的提交消息包含反斜杠。如何转义感叹号,同时仍然忽略反斜杠?

答案1

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

bzr commit -m 'This does work!' 

答案2

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

echo "It's broken"'!'

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

例如:

echo "hello there"'!'" and goodbye"

奖励:可以使用类似的技术来逃脱任何Sh 或 Bash 中的文本(借助 sed):参见这个答案。此外,如果您已经bash-completion安装,您可能已经功能quote()已经可用。

答案3

历史扩展

set +H

或者

set +o histexpand

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

Bash 4.3 添加了特例

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

答案4

我刚刚发现了另一种方法,它至少可以处理echo要用感叹号标点的字符串(句子)。它或多或少绕过了 Bash histexpand,并且只需要花费一点时间来编写代码。

感叹号的十六进制数,如 http://www.ascii-code.com/,是 21,因此如果你\x21在字符串末尾加上 ,它echo -e $foo会产生$foo自己的扩展回显 [即],当你再次获得以结尾的字符串foo=$(echo -e "$foo")时,你得到的echo $foo是字符串。并且也无需切换 histexpand。!

在 Bash 4+ 中肯定可以工作。早期版本,ymmv。

相关内容