在我的(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.'
哪种情况可以忍受,并且切换到双引号字符串不适合我。
答案 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.'