Bash:单引号和双引号和感叹号

我有一个简单的脚本命名example

 #!/bin/sh echo $'${1}' 

请注意这里使用$''是将\n换成新行。 ${1}是传递给此shell脚本的第一个参数。

我想传递一个参数给这个脚本的example ,它打印以下内容:

 #1. You're smart! #2. It's a difficult question! 

我尝试了以下内容:

 example "#1. You're smart!\n#2. It's a difficult question!" 

错误: -bash: !\n#2.: event not found

然后我试图逃跑! 通过单引号,并尝试:

 example '#1. You're smart\!\n#2. It's a difficult question\!' 

它输出:

 ${1} 

任何解决scheme? 非常感谢!

 $ cat t.sh #! /bin/bash echo -e $@ 

或者echo -e $1 ,或者echo -e ${1}如果你只是想处理第一个参数。

为了让bash停止尝试扩大! ,请使用set +H (请参阅在bash中,如何转义感叹号? )

 $ set +H $ ./t.sh "#1. You're smart!\n#2. It's a difficult question!" #1. You're smart! #2. It's a difficult question! 

$''表达式中的内容必须是文字。 你不能在其中扩展其他变量。

但是你可以这样做:

 echo "${1//\\n/$'\n'}" 

Jan Hudec有一个更好的答案:

 echo -e "$1"