扩展 Glob: ?(list)、*(list)、+(list) 和 @(list) 之间的语法有什么区别

扩展 Glob: ?(list)、*(list)、+(list) 和 @(list) 之间的语法有什么区别

阅读有关扩展全局的内容后,我有一个问题。

使用后shopt -s extglob

以下有什么区别?

?(list): Matches zero or one occurrence of the given patterns.

*(list): Matches zero or more occurrences of the given patterns.

+(list): Matches one or more occurrences of the given patterns.

@(list): Matches one of the given patterns.

是的,我已经阅读了上面附带的描述,但出于实际目的,我看不出人们更喜欢 ?(list) 而不是 *(list) 的情况。也就是说,我没有看到任何区别。

我尝试过以下方法:

$ ls
> test1.in test2.in test1.out test2.out`

$ echo *(*.in)
> test1.in test2.in

$ echo ?(*.in)
> test1.in test2.in

我希望仅从描述中$ echo ?(*.in)输出test1.in,但情况似乎并非如此。因此,任何人都可以举一个例子,说明它对所使用的扩展全局类型有什么影响吗?

来源:http://mywiki.wooledge.org/BashGuide/Patterns#Extended_Globs

答案1

$ shopt -s extglob
$ ls
abbc  abc  ac
$ echo a*(b)c
abbc abc ac
$ echo a+(b)c
abbc abc
$ echo a?(b)c
abc ac
$ echo a@(b)c
abc

答案2

“一次或多次出现”是指发生一次或多次相同的文件名,一个或多个文件名不匹配。foo?(.in).x匹配foo.in.x同时foo*(.in).x也应该匹配foo.in.in.x

相关内容