0

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

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

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

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

但这太丑陋了……我能做些什么呢?sh不支持

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

这本来是可以容忍的,切换到双引号字符串对我来说不是一个选择。

4

5 回答 5

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。

于 2013-03-17T09:04:57.953 回答
2

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

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

$原因逃逸处理。

于 2013-03-17T13:54:17.857 回答
1

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

read MYVAR << \EOF
Alice says: "Hello, Bob." But Bob isn't listening.
EOF
于 2013-03-17T20:42:14.540 回答
0

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

MYVAR='Alice says: "Hello, Bob." But Bob '"isn't"' listening.'
于 2013-03-17T14:17:45.027 回答
0

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

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

有关在 bash 中转义符号的更多信息。

于 2013-03-17T10:51:39.310 回答