什么是在单引号字符串中逃避单引号的最美学方法(bash?

时间:2013-03-17 08:58:24

标签: bash escaping sh quotes

在我的(ba)sh剧本中,我有,例如:

MYVAR='Alice says: "Hello, Bob." But Bob isn't listening.'

这是一个语法错误,因为'in isn't结束了单引号字符串。我知道我可以使用

解决这个问题
MYVAR='Alice says: "Hello, Bob." But Bob isn'"'"'t listening.'

但那太丑了......我能做些什么呢? sh不支持

MYVAR='Alice says: "Hello, Bob." But Bob isn\'t listening.'

哪种情况可以忍受,并且切换到双引号字符串不适合我。

5 个答案:

答案 0 :(得分:3)

不,你不能在Bash(或korn shell)中的单引号字符串中嵌入单引号。这是您选择的语言的一个功能。内部单引号没有特殊字符,其中包含\

这是您的某个解决方案的变体,它很难看:

 echo 'Alice says: "Hello, Bob." But Bob isn'\''t listening.'

给出:

Alice says: "Hello, Bob." But Bob isn't listening.

或者使用其他语言,如Perl或Python。

答案 1 :(得分:2)

至少在bash中支持的非POSIX解决方案如下:

MYVAR=$'Alice says: "Hello, Bob." But Bob isn\'t listening.'

$导致转义处理。

答案 2 :(得分:1)

使用HEREDOC是解决这个问题的好方法:

read MYVAR << \EOF
Alice says: "Hello, Bob." But Bob isn't listening.
EOF

答案 3 :(得分:0)

您也可以使用双引号和转义。我想,它比改变语言更简单:

MYVAR="Alice says: \"Hello, Bob.\" But Bob isn't listening."

有关bash中escaping symbols的更多信息。

答案 4 :(得分:0)

我不确定为什么切换到$'...'是一个选项但是切换到双引号不是(可能是为了防止某种参数扩展)。但是你不需要双引号整个字符串:

MYVAR='Alice says: "Hello, Bob." But Bob '"isn't"' listening.'