POSIX Shell:双引号内,`\` 是否无法转义 `$`、```、`"`、`\` 或 ``?

POSIX Shell:双引号内,`\` 是否无法转义 `$`、```、`"`、`\` 或 ``?

根据POSIX Shell 命令语言页面:

\

<backslash>仅当后跟以下字符之一时,应保留其作为转义字符的特殊含义(请参阅转义字符(反斜杠) )当被认为是特殊的:

$ ` " \ <newline>

这似乎意味着用反斜杠转义这五个字符不会产生转义它们的效果,并且如果它们不是“特殊”的话,也不会按字面意思对待它们。

我是否正确地解释了这一点,如果是这样,是否存在用 a 转义这五个特殊字符之一\不会达到转义的预期效果的情况?

答案1

@MichaelHomer 解释了这一点很好。让我们尝试一些实际案例PS1='\$ '

$ echo "$ at start"
$ at start
$ echo "at end $"
at end $
$ echo "$before"

$ echo "after$"
after$

因此,$只有在单词前面加上“特殊”,才能使其成为参数替换。如果我们在所有这些前面加一个反斜杠会发生什么?

$ echo "\$ at start"
$ at start
$ echo "at end \$"
at end $
$ echo "\$before"
$before
$ echo "after\$"
after$

只有“特殊”行发生变化 - 美元符号现在被视为字面意思。它是总是被认为是字面意思。其他角色会发生什么?

$ echo "\ at start"
\ at start
$ echo "at end \"
> ^C
$ echo "\before"
\before
$ echo "after\"
> ^C

所以反斜杠只是非特殊字符之前的另一个文字字符。 (^C 是我必须取消命令行的地方,因为引号字符已被转义。)

答案2

比如说,一个字符$具有特殊含义,并且当它除了作为数据的字面部分之外还具有某种影响时,就被认为是特殊的。在 中$x$引入参数扩展具有特殊含义。

这段话的意思是反斜杠有其转义字符的含义仅有的当它位于这些具有特殊含义的字符之一之前时。按说,反斜杠具有更广泛的转义含义:

未加引号的 <backslash> 应保留后续字符的文字值,但 <newline> 除外

例如,"\$x"是字符串“$x”,而"a\ b"是字符串“a\ b”,因为第二种情况中的反斜杠位于未列出的字符之前,因此没有特殊含义。然而,双引号外面a\ b是字符串“a b”,反斜杠导致空格按字面意思包含在内,并且反斜杠本身被删除。

你引用的那段话并不是说有时角色保持尽管逃脱了它们的特殊意义,而是反斜杠没有特殊含义,除非它会影响其中之一。


这里有一个潜在的悬空修饰符:是人物被认为是特殊的,或者反斜杠

在某些潜在的情况下,双引号内的某些字符可能没有特殊含义 - 最明显的是在紧接您引用的点的前一个点, 但是也在此处文档的分隔符中。然而,嵌入式扩展有自己的引用规则,就像这里文档分隔符一样,所以我不清楚它实际上是否会出现。如果是反斜杠,它只表示双反斜杠不会转义任何内容。

我所知道的最好的情况是,如果限制字符,可能会出现这里文档分隔符:

cat <<"A$B"
A$B
cat <<"A\$B"
A$B

这两个在我所有的 shell 上都做同样的事情。可以说,$并不特殊,因为它第一次包含在分隔符中,因此\内部双引号第二次不应该转义,并且应该按字面意思包含在内。我认为不清楚这是必需的行为,但它似乎确实符合法律条文。

对于嵌入式扩展,它们要么拒绝引号(两种$(...))的任何影响,要么有自己的引用规则,并且没有独特的方式来引用某些内容(各种${...}` ... `),并且我还没有设法构造出明确的东西应该有这些字符之一的非特殊版本,并在其前面有一个非特殊反斜杠。

我怀疑粗体文本目前是多余的。潜在的悬空修饰符至少使它变得含糊不清,也许这是一个需要提交勘误表或下次更新的措辞错误。

答案3

让我们尝试简化一下。
正文如下:

仅当被视为特殊时,<反斜杠> 后跟以下字符之一时,才应保留其作为转义字符的特殊含义(请参阅转义字符(反斜杠)):

我们可以转换它的一些部分:

  1. <反斜杠> ==>

  2. ...应保留其作为转义字符的特殊含义
    ... \__________/------------------------\__________________/
    ==> 仍然是-------------------------------- 转义符
    ==> 仍然是转义符

    正如它在联合国- 带引号的字符串。

  3. ... 仅有的

  4. ...当后跟以下字符之一时 ==> A在[$`"\之前荷兰]

  5. ...当被认为特殊时

那么,1,2,4 读作: 仍然是 [$`"\ 之前的转义荷兰]

  • 争议的部分是:当被认为是特殊的

    什么是存在被认为是特殊的

    我相信它是>>“人物”<<。如所写:

    当被认为特殊时,以下字符之一:

    问:例如:什么时候是"特殊的(双引号内)?

    答:总是(不考虑像 之类的嵌套结构echo "$(sed 's/["]//' file)")。

    因此,反斜杠总是引用": echo "a\"b\"b\""(再次强调:没有嵌套结构)。

  • 那么,1,2,3,4 和 5 应该读作:

    仍然是一种逃避仅有的特别的[$`"\荷兰]

那么,回答你的问题:

是否存在\无法转义$、```、"\的情况<newline>

是:是的,当字符 [$`"\荷兰] 并不特别。

他们(角色)可能是不特别在嵌套结构(例如)内但在引号内。

相关内容