鉴于这些文件:

$ ls
file1  file2  file21  file3  fileFoo

我期望这种通配模式(启用 extglob 的 bash):
$ ls file?({1..2}|Foo)

输出:
file1  file2  fileFoo

但是我用 fileFoo 列出了两次:
$ ls file?({1..2}|Foo)
file1  file2  fileFoo  fileFoo

“或”的任何一方都不会产生意想不到的结果:
$ ls file?({1..2})
file1  file2

$ ls file?(Foo)
fileFoo

那么为什么当我“或”表达式时 fileFoo 打印两次,以及匹配范围(例如上面的 1-2 但可能是 17-593 或任何其他范围)或其他一些不相关的字符串(例如 Foo )的正确通配模式是什么以上)?
$ bash --version
GNU bash, version 4.4.12(3)-release (x86_64-unknown-cygwin)

最佳答案

在通配之前执行扩展:

file?({1..2}|Foo)

变成
file?(1|Foo) file?(2|Foo)

然后两个参数都被全局化。

仅使用如下扩展可按预期工作,但会导致 nullglob 等问题:
file{{1..2},Foo}

关于bash extglob范围或值匹配相同的文件名两次,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44424626/

10-12 00:43