怎么写 ”!” bash中双引号之间的符号?

时间:2015-11-29 08:48:04

标签: linux string bash shell unix

当把它放在双引号字符串中时,我无法弄清楚如何在bash脚本中编写!符号。

例如:

var="hello! my name is $name! bye!"

疯狂的事情发生了:

Boda-Cydo-Sith-Computer:~$ age=20
Boda-Cydo-Sith-Computer:~$ name='boda'
Boda-Cydo-Sith-Computer:~$ var="hello! my name is $name! bye!"

当我按最后一个命令输入时,命令重复自身(键入自身)而没有最后一个!

Boda-Cydo-Sith-Computer:~$ var="hello! my name is $name! bye"

如果我再次按回车

Boda-Cydo-Sith-Computer:~$ var="hello! my name is $name bye"

如果我再次按回车键,它就会消失,无法输出

Boda-Cydo-Sith-Computer:~$ 

如果我试试这个:

Boda-Cydo-Sith-Computer:~$ echo "hello\! my name is $name\! bye\!"

然后输出:hello\! my name is boda\! bye\!

如果我使用单引号,那么我的名字就不会扩展:

Boda-Cydo-Sith-Computer:~$ echo 'hello! my name is $name! bye!'

输出为:hello! my name is $name! bye!

我以这种方式工作:

Boda-Cydo-Sith-Computer:~$ echo "hello"'!'" my name is $name"'!'" bye"'!'

"'无法理解/编辑/维护/更新是一个大问题。

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:2)

如果启用了历史记录扩展(通常情况下,除非您明确禁用它),!后面跟不是空格的东西将尝试查找历史记录中以该字符串后面的字符串开头的最后一个命令

因此,代码中唯一有问题的!出现在bye!中。你可以添加一个尾随空格(至少可以说是hacky),或者你可以像你一样把它放在单引号中,但是没有必要对其他!执行此操作。 (因为它们后跟一个空格),所以命令不是那么难以阅读/编辑:

var="hello! my name is $name! bye"'!'

这就是你所需要的一切。或者,当然,如果您不打算使用shell的历史记录扩展功能,您可以随时使用set +o histexpand禁用它,然后这不会成为问题。