为什么分词和文件名扩展不适用于 `[[ ... ]]` 中的条件表达式?

Tim*_*Tim 0 bash

来自 Bash 参考手册

分词部分的规则:

shell 扫描没有出现在双引号内的参数扩展、命令替换和算术扩展的结果以进行分

文件名扩展部分的规则:

分词后,除非设置了 -f 选项(参见第 4.3.1 节 [The Set Builtin],第 58 页),Bash 会扫描每个单词以查找字符 '*'、'?' 和 '['。如果出现这些字符中的一个,则将该单词视为一个模式,并替换为按字母顺序排序的与该模式匹配的文件名列表

因此,在参数扩展、命令替换和算术扩展之后,除非在双引号内的部分上,否则会发生分词。

  1. 在 中[[ ... ]]GilesJohn1024都说分词和文件名扩展不适用于[[ ... ]]. Bash 参考手册或 POSIX 7 规范中的哪些规则管理它?

    • 里面的条件表达式[[ ... ]]不是双引号,那么为什么分词不适用呢?

    • -f选项未设置。为什么文件名扩展也不适用?

  2. 此外[[ ... ]],是否还有其他情况下分词、文件名扩展或两者都不适用?他们认为两者中的一个或两个不适用的原因是否与 相同[[..]]

  3. 分词和文件名扩展是否总是齐头并进,因为它们要么都适用,要么都不适用于每种情况?

gle*_*man 5

命令文档中[[,您将看到

[[和]]之间的词不进行分词和文件名扩展;执行波浪号扩展、参数和变量扩展、算术扩展、命令替换、进程替换和引号删除。

(强调我的)

case声明也有豁免

在尝试匹配之前,单词会经历波浪号扩展、参数扩展、命令替换、算术扩展和引号删除。每个模式都经历波浪号扩展、参数扩展、命令替换和算术扩展。

值得注意的是它们的缺席是分词和文件名扩展。

此外,变量赋值(参见Shell 参数

一个变量可以通过以下形式的语句赋值

name=[value]

如果未给出值,则为变量分配空字符串。所有值都经过波浪号扩展、参数和变量扩展、命令替换、算术扩展和引号删除

所以这是安全的:

a="hello world"
b=$a
Run Code Online (Sandbox Code Playgroud)

其他不进行分词的地方:

我的技巧:在 bash 手册中搜索“undergo”这个词。