2012-10-14 19 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'' –