为什么 echo "\*" 和 echo "\\*" 一样

为什么 echo "\*" 和 echo "\\*" 一样

标题。 具有与,echo "\*"完全相同的输出echo "\\*"\*我正在使用 GNU bash 5.2.15。

我期望echo "\\*"输出\*,但我不知道为什么 echo "\*"也输出。据我所知,事情应该是这样的:

  1. 巴什看到:$echo "\*"
  2. Bash 处理双引号,不转义反斜杠:$echo \*
  3. Bash*使用反斜杠转义:$echo *
  4. 重击打印*

我的怀疑在于3。我相信反斜杠不会转义,*因为它已经在2中转义了。这是正确的吗?

答案1

\就好像\没有逃脱的事情发生一样。

来自Bash 手册的双引号部分:

前面没有特殊含义的反斜杠字符保持不变。

因此"\*",which 没有发生转换与"\\*"where\\未转义为 相同\。该echo命令也不会转换任何内容,因为它会产生与printf %s.

答案2

是的,确实,双引号逃脱了通配符*

因为*双引号内的 没有任何意义,所以反斜杠无法转义它。

处理反斜杠时,bash 检查后面的字符在当前状态是否具有特殊含义。如果是,则不会打印反斜杠,并且将转义下一个字符。如果不是,则仅打印反斜杠。

因此,在 case 中"\*",第一个反斜杠保护 a *,无需在此双引号上下文中转义,因此只需打印它即可。

但以防万一"\\*",第一个反斜杠保护了一个反斜杠在双引号上下文中具有特殊含义,因此它将被第一个反斜杠转义。这意味着将打印第二个反斜杠。

相关内容