来自 Bash 参考手册
分词部分的规则:
shell 扫描未出现在双引号内的参数扩展、命令替换和算术扩展的结果分词。
文件名扩展部分的规则:
分词后,除非设置了 -f 选项(请参见第 4.3.1 节 [内置设置],第 58 页),Bash 会扫描每个单词中的字符 '*'、'?' 和 '['。如果出现这些字符之一,则该单词被视为一种模式,并替换为按字母顺序排序的列表文件名匹配模式
因此,在参数扩展、命令替换和算术扩展之后,除非双引号内的部分,否则会发生分词。
答案1
在里面[[
命令的文档, 你会看到的
不执行分词和文件名扩展关于 [[ 和 ]] 之间的单词;执行波形符扩展、参数和变量扩展、算术扩展、命令替换、进程替换和引号删除。
(强调我的)
还有case
陈述有豁免
这单词在尝试匹配之前会经历波形符扩展、参数扩展、命令替换、算术扩展和引号删除。每个图案进行波形符扩展、参数扩展、命令替换和算术扩展。
值得注意的是,它们的缺失是分词和文件名扩展。
此外,变量赋值(参见外壳参数)
可以通过以下形式的语句将变量赋值给
name=[value]
如果价值未给出,则为该变量分配空字符串。全部价值观进行波形符扩展、参数和变量扩展、命令替换、算术扩展和引号删除
所以这是安全的:
a="hello world"
b=$a
其他不进行分词的地方:
我的技巧:在 bash 手册中搜索“undergo”这个词。
答案2
[[
和中的单词]]
是一个扩展,bash 使用它(除其他外)来提供正则表达式:
还可以使用附加二元运算符“=~”,其优先级与“==”和“!=”相同。使用时,运算符右侧的字符串被视为扩展正则表达式并进行相应匹配(如 regex3))。
对正则表达式进行文件名扩展不会有任何帮助,因为两者都使用相同的*
元?
字符用于不同的目的。
进一步阅读:
- 3.2.4.2 条件构造(Bash 参考手册)