2011-05-16 134 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