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

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

来自 Bash 参考手册

分词部分的规则:

shell 扫描未出现在双引号内的参数扩展、命令替换和算术扩展的结果分词

文件名扩展部分的规则:

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

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

  1. [[ ... ]]贾尔斯约翰1024两者都表示分词和文件名扩展不适用于[[ ... ]]. Bash 参考手册或 POSIX 7 规范中的哪些规则对此进行管理?

    • 其中的条件表达式[[ ... ]]没有双引号,那么为什么不应用分词呢?

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

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

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

答案1

在里面[[命令的文档, 你会看到的

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

(强调我的)

还有case陈述有豁免

单词在尝试匹配之前会经历波形符扩展、参数扩展、命令替换、算术扩展和引号删除。每个图案进行波形符扩展、参数扩展、命令替换和算术扩展。

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

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

可以通过以下形式的语句将变量赋值给

name=[value]

如果价值未给出,则为该变量分配空字符串。全部价值观进行波形符扩展、参数和变量扩展、命令替换、算术扩展和引号删除

所以这是安全的:

a="hello world"
b=$a

其他不进行分词的地方:

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

答案2

[[和中的单词]]是一个扩展,bash 使用它(除其他外)来提供正则表达式:

还可以使用附加二元运算符“=~”,其优先级与“==”和“!=”相同。使用时,运算符右侧的字符串被视为扩展正则表达式并进行相应匹配(如 regex3))。

对正则表达式进行文件名扩展不会有任何帮助,因为两者都使用相同的*?字符用于不同的目的。

进一步阅读:

相关内容