2012-10-14 50 views
14

如果我使用單引號,也就是說用單引號(「不」),很煩人逃脫:zsh或bash是否有便於英文文本的引號?

'Don'"'"'t do that' 

如果我使用雙引號,美元符號和感嘆號行程起來:

"It cost like \$1000\!" 

是否有另一種引用我可以使用?

編輯:我還應該補充一點,我想直接將這個字符串作爲命令行參數傳遞,而不是將其存儲在變量中。爲此我試過,用DigitalRoss的解決方案,

$ echo "$(cat << \EOF 
Don't $worry be "happy". 
EOF)" 

,但得到

dquote cmdsubst> 

按下回車鍵後:/。所以在這一點上,ZyX的建議setopt rcquotes看起來是最方便的。

+0

最後一個'EOF'需要自己排成一行,沒有其他字符。在下一行放置右括號。 –

+0

@glennjackman我得到了同樣的結果。 – Owen

+0

嗯,shell正在等待單引號匹配。 –

回答

19

隨着zsh中你可能做

setopt rcquotes 

。然後ASCII撇號像這樣被轉義:

echo 'Don''t' 

。或設置你的鍵盤佈局,以能夠進入UTF撇號,他們在任何外殼採用任何形式的報價(包括無)的任何問題:

echo 'Don’t' 

。第三個適用於zsh和bash:

echo $'Don\'t' 

既沒有第一個也沒有第三個可以縮小對單個字符的引用,但對於非冗長的字符串,它們仍然不夠詳細,然後上面提到了heredocs。有了zsh,你可以通過使用自定義接受線部件來完成此操作,它將用'Don'\''t'替換'Don't'之類的結構。需要相當棘手的正則表達式魔法,我只能在Perl中寫入;並且可能不是最好的想法,因爲我不能假裝我可以在所有可能的情況下覆蓋所有可能的情況。在任何情況下都不會觸及任何腳本。

3

如果你要分配引用的文本到一個變量,你仍然可以使用here文檔,如(它可以是一個多行文本太):

read -r -d '' VAR <<'ENDOFVAR' 
This "will be" a 'really well' escaped text. Or won't. 
ENDOFVAR 
+0

謝謝,更正 –

4

我喜歡Zsolt Botykai會的方向。這是一個適用於任何Posix shell的例子。 (我也證實它存活了它的粘貼到SO服務器。)

$ read -r x << \EOF 
Don't $worry be "happy". 
EOF 
$ echo $x 
Don't $worry be "happy". 

使這項工作的事情;

  • -r會讓\不會魔法
  • \EOF,而不是僅僅EOF使得$不會魔法
+0

請注意,除非您從'$ IFS'中刪除它們,否則前導和尾隨空白將被刪除。此外,它只適用於單行文本。 –

+0

我相信,如果你使用單引號''EOF',它具有單引號整個文本的效果:'read -r x <<'EOF'' –