我不明白 bash 如何评估单引号字符串中撇号字符的转义。
以下是一个例子:
$ echo ''\''Hello World'\'''
'Hello World' # works
$ echo '\'Hello World\''
> # expects you to continue input
我尝试寻找对此的解释,但一无所获。bash 在这里做什么?
答案1
在单引号中,无法进行转义。无法将单引号包含到单引号中。请参阅引用在男子猛击。
但是,您可以结束单引号字符串并在双引号中输入撇号或用反斜杠转义。
echo 'string'"'"
echo 'string'\'
答案2
除了 POSIX 支持的单引号和双引号之外,bash
还提供了一种附加类型的引号,以允许在引号字符串中使用一小类转义字符(包括单引号):
$ echo $'\'Hello World\''
'Hello World'
bash
请参阅手册页中靠近该部分末尾的QUOTING 部分。(搜索“ANSI C”。)
答案3
在 shell 中转义引号的简单示例:
$ echo 'abc'\''abc'
abc'abc
$ echo "abc"\""abc"
abc"abc
其方法是关闭已经打开的一个 ( '
),放置已转义的一个 ( \'
) 进行打印,然后打开另一个 ( '
)。
或者:
$ echo 'abc'"'"'abc'
abc'abc
$ echo "abc"'"'"abc"
abc"abc
其方法是:完成已打开的一个 ( '
),将引文放入另一个引文 ( "'"
),然后打开另一个 ( '
)。
你所做的('\'Hello World\''
),是:
- 打开的第一个撇号:
'
。 - 紧接着关闭
\'
,因此字符串变成:'\'
。 Hello World
不是引号。- 放置独立的撇号 (
\'
) 而不打开它。 - 最后一个撇号 (
'
) 是开字符串,但是没有预期的闭字符串。
因此正确的例子应该是:
$ echo \'Hello World\'
'Hello World'
有关的:如何在单引号字符串中转义单引号?
答案4
为了解释转义撇号发生了什么,我们将检查你的第二个例子(另见单引号, 或者强有力的引言):
$ echo '\'Hello World\''
> # expects you to continue input
正如您所说的,这里您没有引用引文。现在修剪结尾并将其更改为:
v v v
$ echo '\'Hello World # Echo two strings: '\' and 'Hello World'.
\Hello World ^
这里没有引用“Hello World”子字符串,但它表现为仿佛引用得非常强烈。再次使用您的示例,这次以不同的方式修剪结尾:
vv v (plain apostrophe)
$ echo '\'Hello World\' # Will echo: '\' and 'Hello World''
\Hello World' ^^ # Note that the trailing ' char is backslash escaped.
“Hello World”子字符串再次表现得像被强引用一样,只是在末尾添加了撇号(转义,因此不再是单引号)。
当在末尾添加另一个单引号(您的原始示例)时,字符串将悬而未决并等待关闭引号。