zsh 或 bash 是否有方便英文文本的引号



如果我使用单引号,带有撇号("don't")的单词很烦人:

'Don'"'"'t do that'

如果我使用双引号,美元符号和感叹号会绊倒它:

"It cost like $1000!"

我可以使用另一种报价吗?

编辑:我还应该补充一点,我想直接将此字符串作为命令行参数传递,而不是将其存储在变量中。为此,我尝试使用DigitalRoss的解决方案,

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

但得到

dquote cmdsubst> 

按回车键后:/.因此,在这一点上,ZyX的setopt rcquotes建议看起来是最方便的。

使用 zsh 你可以做

setopt rcquotes

.然后 ASCII 撇号就像这样转义

echo 'Don''t'

.或者设置您的键盘映射以便能够输入 UTF 撇号,它们在任何 shell 中都没有任何类型的引号(包括无引号)的问题:

echo 'Don’t'

.第三个作品同时适用于 zsh 和 bash:

echo $'Don't'

.

第一和第三都不能将引用范围缩小到单个字符,但对于非冗长的字符串,它们仍然不如上面建议的 heredocs 那么冗长。使用 zsh,您可以通过使用自定义接受线小部件来做到这一点,该小部件将用 'Don'''t' 替换 'Don't' 等结构。需要相当棘手的正则表达式魔法,我只能用 perl 编写;并且可能不是最好的主意,因为我不能假装我可以在它们发生之前涵盖所有可能的情况。在任何情况下,它都不会触及任何脚本。

我喜欢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使$不是魔法

如果你想将引用的文本分配给变量,你仍然可以使用 heredocs,比如(它也可以是多行文本):

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

Bash 语法$'string'是另一种引用机制,它允许类似 ANSI C 的转义序列并扩展到单引号版本。

$> echo $'Don't $worry be "happy".'
Don't $worry be "happy".

有关更多详细信息,请参阅 https://stackoverflow.com/a/16605140/149221。

相关内容

  • 没有找到相关文章

最新更新