如何在bash中使用单引号引起来的撇号?


18

我不明白bash如何评估单引号引起来的撇号字符的转义。

这是一个例子:

$ echo ''\''Hello World'\'''
'Hello World' # works

$ echo '\'Hello World\''
 > # expects you to continue input

我试图寻找对此的解释,但什么也没得到。bash在这里做什么?


echo \''Hello World'\'
2012年

Answers:


19

用单引号引起来的转义是不可能的。无法将单引号包含在单引号中。见报价人的bash


1
你是对的。诀窍在于:“即使在单引号前加反斜杠,也可能不会在单引号之间出现单引号”,因此可能会将其拆分为不同的部分。
基贝(Kibet)2012年

@Colin一旦单引号位于其他两个单引号内(但反斜杠),则引号不再是真实的引号。它只是一个没有特殊配对特征的字符。
zero2cx 2012年

1
@ zero2cx:不正确:echo '\''
choroba 2014年

@ zero2cx:我会说“外部”而不是“内部”。
choroba 2014年

3
@choroba不是“完全”正确,可以使用bashecho $'\'hello world\''
bufh 2014年

9

除了POSIX支持的单引号和双引号之外,还bash提供了另一种引号,以允许在带引号的字符串中使用一小类转义字符(包括单引号):

$ echo $'\'Hello World\''
'Hello World'

请参见bash手册页末尾的“ 报价”部分。(搜索“ ANSI C”。)


3

为了解释转义的撇号发生了什么,我们将检查您的第二个示例(另请参见单引号强引号):

$ 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”子字符串再次表现为强引号,但仅在末尾添加了撇号(转义,因此不再单引号)。

当另一个单引号添加到末尾时(您的原始示例),该字符串将挂起并等待右引号。


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'

相关:如何在单引号字符串中转义单引号?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.