2011-05-16 201 views
2

我有一个简单的脚本命名为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} 

任何解决办法吗?非常感谢!

+0

垫提供了完美的解决方案!感谢Chris Jester-Young和Jan Hudec。所有专家! – DocWiki 2011-05-16 12:16:31

回答

3
$ cat t.sh 
#! /bin/bash 
echo -e [email protected] 

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

为了让庆典停止试图扩大!,使用set +H(见In bash, how do I escape an exclamation mark?

$ 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! 
+0

非常感谢!但是我的工作不会在你的工作中进行:脚本是'echo -e $ {1}'并且使用'example'#1,你很聪明!\ n#2。你真聪明\! #2。这是一个困难的问题\!'请注意'\!',但我想'!'。 – DocWiki 2011-05-16 11:51:54

+0

我编辑了我的评论。换行符有效,但我想'!'同时打印'\!'。 – DocWiki 2011-05-16 11:55:13

+1

还有其他问题,使用'$ {1}'(或普通的'$ 1')不会改变任何输出。尝试开始一个新的外壳,也许你已经搞砸了你的环境了一下。 – Mat 2011-05-16 11:59:49

2

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

但你可以这样做:

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

扬邬达克有一个更好的答案:

echo -e "$1" 
+1

Echo知道解释转义序列本身!它在不同的shell中以不同的方式完成,但只要bash被请求,'echo -e“$ 1”'就可以做到这一点。 – 2011-05-16 11:34:04

+0

我知道单引号不会展开变量。但我需要换行符。 '$'''似乎是唯一的解决方案。 – DocWiki 2011-05-16 11:34:53

+0

@Jan:是的,没错。我也会添加你的答案。 :-) – 2011-05-16 11:35:57