!
当将符号放在双引号字符串中时,我不知道如何在 bash 脚本中编写符号。
例如:
var="hello! my name is $name! bye!"
一些疯狂的事情发生了:
$ age=20
$ name='boda'
$ var="hello! my name is $name! bye!"
当我在最后一个命令处按 Enter 时,该命令会重复自身(自行键入),而没有最后一个!
:
$ var="hello! my name is $name! bye"
如果我再次按 Enter 键
$ var="hello! my name is $name bye"
如果我再次按 Enter 键,它就会消失,不会有任何输出
$
如果我尝试这个:
$ echo "hello\! my name is $name\! bye\!"
然后它输出:hello\! my name is boda\! bye\!
如果我使用单引号,那么我的名字不会被扩展:
$ echo 'hello! my name is $name! bye!'
输出为:hello! my name is $name! bye!
我有这样的工作方式:
$ echo "hello"'!'" my name is $name"'!'" bye"'!'
但这是一团糟"
,'
无法理解/编辑/维护/更新。
有人可以帮忙吗?
答案1
正如您所发现的,!
不会触发单引号内的历史扩展。
您可以使用包含单引号中的符号printf
的格式字符串。!
例如:
$ name="boda"
$ printf 'hello! my name is %s! bye!\n' "$name"
hello! my name is boda! bye!
或者
$ name="boda"
$ var=$(printf 'hello! my name is %s! bye!\n' "$name")
$ echo "$var"
hello! my name is boda! bye!
答案2
禁用历史扩展;仅在交互式 shell 中启用,通过:set +H
。