来自Bash参考手册
“分词规则”部分:
shell扫描参数展开、命令替换和算术扩展的结果,这些结果没有出现在双引号内,用于分词。
来自Filename展开部分的规则:
在分词后,除非设置了-f选项(请参阅4.3.1 集建,第58页),否则Bash会扫描每个单词的字符“*”、“?”和“[”。如果出现其中一个字符,则该单词被视为模式,并替换为与模式匹配的按字母排序的文件名列表。
因此,在参数展开、命令替换和算术扩展之后,除非对双引号中的部分进行分词,否则会发生分词现象。
发布于 2016-03-16 21:31:56
在[ [[命令的文档](https://www.gnu.org/software/bash/manual/bashref.html#index-_005b_005b)中,您将看到
不对[和]之间的单词执行分词和文件名展开;执行倾斜展开、参数和变量展开、算术扩展、命令替换、进程替换和移除引号。
(强调地雷)
此外,case语句也有豁免
在尝试匹配之前,该词经历了倾斜扩展、参数扩展、命令替换、算术扩展和引号删除。每个模式都经历了倾斜扩展、参数扩展、命令替换和算术扩展。
值得注意的是,它们的缺失是分词和文件名扩展。
此外,变量赋值(参见壳参数)
如果不给变量赋值,则可以通过表单
name=[value]的语句为变量赋值为空字符串。所有值都经历了倾斜展开、参数和变量展开、命令替换、算术展开和移除引号。
所以这是安全的:
a="hello world"
b=$a未进行分词的其他地方:
我的窍门:在bash手册中搜索“接受”这个词。
发布于 2016-03-16 21:29:04
[[和]]中的单词是一个扩展,bash使用它(除其他外)提供正则表达式:
还有一个二进制运算符‘=~’是可用的,其优先级与‘==’和‘!=’相同。当使用它时,操作符右边的字符串被视为扩展正则表达式,并相应地进行匹配(如在regex3中)。
在正则表达式上进行文件名扩展是没有帮助的,因为两者都将相同的*和?元字符用于不同的目的。
进一步读:
https://unix.stackexchange.com/questions/270298
复制相似问题