只有引用字符串是不是受到通配符:
$ echo ".[].aliases[]"
.[].aliases[]
但是未引用的字符串可能会出现乱码。包含*
或?
或(有效)[]
(括号表达式)的无引号的字符串将由与其匹配的文件列表进行修改。就像a *
将转换为匹配目录中的所有文件,a ?
将仅匹配一个字符的文件,a(有效)[]
将匹配括号内字符的文件一样。点是有效字符:
$ echo a[.]b
a[.]b
$ touch "a.b"
$ echo a[.]b
a.b
为了与之匹配,]
它应该是方括号内的第一个字符:
$ touch "a]b"
$ ls a[]]b
a]b
空括号表达式没有任何意义(并且不会扩展):
$ touch ab
$ ls a[]b
ls: cannot access 'a[]b': No such file or directory
这就是为什么这样工作:
$ touch a]c abc afc azc a:c a?c aoc
$ ls a[]bfz:?]c
abc a:c a?c a]c afc azc
对于[
这个想法是类似的:
$ touch a[c
$ ls a[[]c
a[c
但它可以在方括号表达式中的任何位置:
$ ls a[]bf[z:?]c
abc a:c a?c a[c a]c afc azc
$ ls a[]bfz:?[]c
abc a:c a?c a[c a]c afc azc
您发布的字符串.[].foo[]
将匹配一个点,然后是a ]
,a .
,a f
,a o
或a [
。它类似于:
$ echo a[].foo[]c
a[c a]c afc aoc
它将匹配如下:
$ touch .] .f .o .[ .a .b .z
$ echo .[].foo[]
.. .[ .] .f .o
请注意,..
默认情况下不需要创建目录条目,因为它存在于每个目录中。但是,一个简单的点.
不会被一个glob匹配,因为它需要显式地匹配(实际上是使用一个点)。
但这将不匹配,..aliases
因为方括号表达式只能匹配一个字符。要匹配几个字符,您需要使用*
(任何字符):
$ touch ..a ..l ..i ..aliases ..alias ..ali
$ echo .[].aliases[]
.. .[ .] .a
$ echo .[].aliases[]*
.. .[ .] .a ..a ..ali ..alias ..aliases ..i ..l