标题。 具有与,echo "\*"
完全相同的输出echo "\\*"
。\*
我正在使用 GNU bash 5.2.15。
我期望echo "\\*"
输出\*
,但我不知道为什么 echo "\*"
也输出。据我所知,事情应该是这样的:
- 巴什看到:
$echo "\*"
- Bash 处理双引号,不转义反斜杠:
$echo \*
- Bash
*
使用反斜杠转义:$echo *
- 重击打印
*
。
我的怀疑在于3。我相信反斜杠不会转义,*
因为它已经在2中转义了。这是正确的吗?
答案1
\
就好像\
没有逃脱的事情发生一样。
前面没有特殊含义的反斜杠字符保持不变。
因此"\*"
,which 没有发生转换与"\\*"
where\\
未转义为 相同\
。该echo
命令也不会转换任何内容,因为它会产生与printf %s
.
答案2
是的,确实,双引号逃脱了通配符*
。
因为*
双引号内的 没有任何意义,所以反斜杠无法转义它。
处理反斜杠时,bash 检查后面的字符在当前状态是否具有特殊含义。如果是,则不会打印反斜杠,并且将转义下一个字符。如果不是,则仅打印反斜杠。
因此,在 case 中"\*"
,第一个反斜杠保护 a *
,无需在此双引号上下文中转义,因此只需打印它即可。
但以防万一"\\*"
,第一个反斜杠保护了一个反斜杠能在双引号上下文中具有特殊含义,因此它将被第一个反斜杠转义。这意味着将打印第二个反斜杠。