你如何在bash中的单引号字符串中转义撇号?

Kib*_*bet 22 bash shell-script string escape-characters

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

下面是一个例子:

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

$ echo '\'Hello World\''
 > # expects you to continue input
Run Code Online (Sandbox Code Playgroud)

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

cho*_*oba 21

在单引号中,无法转义。没有办法如何将单引号包含在单引号中。请参阅在man bash 中引用

  • @choroba 不是“完全”正确,在 bash 中你可以做 ``echo $'\'hello world\''`` (3认同)

che*_*ner 12

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

$ echo $'\'Hello World\''
'Hello World'
Run Code Online (Sandbox Code Playgroud)

请参阅bash手册页中的 QUOTING 部分,靠近该部分的末尾。(搜索“ANSI C”。)


ken*_*orb 6

在 shell 中转义引号的简单示例:

$ echo 'abc'\''abc'
abc'abc
$ echo "abc"\""abc"
abc"abc
Run Code Online (Sandbox Code Playgroud)

它是通过关闭已经打开的一个 ( '),将转义的一个 ( \') 打印出来,然后打开另一个 ( ') 来完成的。

或者:

$ echo 'abc'"'"'abc'
abc'abc
$ echo "abc"'"'"abc"
abc"abc
Run Code Online (Sandbox Code Playgroud)

它是通过完成已经打开的一个 ( '),将引号放在另一个引号 ( "'") 中,然后打开另一个 ( ') 来完成的。

你所做的('\'Hello World\'')是:

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

所以正确的例子是:

$ echo \'Hello World\'
'Hello World'
Run Code Online (Sandbox Code Playgroud)

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