bash中的..] [foo []`是做什么的?为什么匹配`..`?


16

请看以下内容:

$ echo .[].aliases[]
..
$ echo .[].foo[]
..
$ echo .[].[]
..
$ echo .[].xyz[]
..
$ echo .xyz[].xyz[]
.xyz[].xyz[]
$ echo .xyz[].[]
.xyz[].[]

显然,这似乎有些混乱,但我不明白结果如何结合在一起。据我了解[]是一个空字符类。如果直观的话

  • 它只匹配空字符串;在这种情况下,我希望bash能够完全复制,因为在此目录中没有与之匹配的东西,而且还与..aliases(在第一个示例中)匹配,
  • 或一无所有;在这种情况下,我希望bash也会完全复制字符串。

这与GNU bash 4.4.23(1)版一起发布。

Answers:


25

[开始一组。集以终止]。但是有一种方法可以将其]作为集合的一部分,那就是将指定]为第一个字符。由于空集没有任何意义,所以这并不是模棱两可的。

因此,您的示例基本上都是一个点,然后是一个包含点的集合,因此它匹配两个点。

后面的示例找不到任何文件,因此按原样返回。


4

只有引用字符串是不是受到通配符:

$ 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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.