在 Bash 中,如何转义单引号字符串中的撇号?

在 Bash 中,如何转义单引号字符串中的撇号?

我不明白 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\''),是:

  1. 打开的第一个撇号:'
  2. 紧接着关闭\',因此字符串变成:'\'
  3. Hello World不是引号。
  4. 放置独立的撇号 ( \') 而不打开它。
  5. 最后一个撇号 ( ') 是开字符串,但是没有预期的闭字符串。

因此正确的例子应该是:

$ 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”子字符串再次表现得像被强引用一样,只是在末尾添加了撇号(转义,因此不再是单引号)。

当在末尾添加另一个单引号(您的原始示例)时,字符串将悬而未决并等待关闭引号。

相关内容