bash extglob 范围或值匹配相同的文件名两次
bash extglob range-or-value matching same file name twice
鉴于这些文件:
$ ls
file1 file2 file21 file3 fileFoo
我期待这种通配模式(bash 启用了 extglob):
$ ls file?({1..2}|Foo)
输出:
file1 file2 fileFoo
但我得到的是 fileFoo
列出了两次:
$ ls file?({1..2}|Foo)
file1 file2 fileFoo fileFoo
"or" 的任何一方都没有产生意想不到的结果:
$ ls file?({1..2})
file1 file2
$ ls file?(Foo)
fileFoo
那么为什么当我 "or" 表达式时 fileFoo
打印两次以及匹配范围的正确通配模式是什么(例如上面的 1-2 但可以是 17-593 或任何其他范围)或一些其他不相关的字符串(例如上面的 Foo)?
$ bash --version
GNU bash, version 4.4.12(3)-release (x86_64-unknown-cygwin)
扩展在 globbing 之前执行:
file?({1..2}|Foo)
变成
file?(1|Foo) file?(2|Foo)
然后两个参数都是通配符。
仅使用如下扩展按预期工作,但会出错 nullglob
等:
file{{1..2},Foo}
它被解释为:
ls file?(1|Foo) file?(2|Foo)
范围正在扩大,然后每个值与|Foo
合并。
因此,当展开每个模式时,您会得到以数字结尾的文件和以 Foo
结尾的文件。
尝试:
ls file{{1..2},Foo)
鉴于这些文件:
$ ls
file1 file2 file21 file3 fileFoo
我期待这种通配模式(bash 启用了 extglob):
$ ls file?({1..2}|Foo)
输出:
file1 file2 fileFoo
但我得到的是 fileFoo
列出了两次:
$ ls file?({1..2}|Foo)
file1 file2 fileFoo fileFoo
"or" 的任何一方都没有产生意想不到的结果:
$ ls file?({1..2})
file1 file2
$ ls file?(Foo)
fileFoo
那么为什么当我 "or" 表达式时 fileFoo
打印两次以及匹配范围的正确通配模式是什么(例如上面的 1-2 但可以是 17-593 或任何其他范围)或一些其他不相关的字符串(例如上面的 Foo)?
$ bash --version
GNU bash, version 4.4.12(3)-release (x86_64-unknown-cygwin)
扩展在 globbing 之前执行:
file?({1..2}|Foo)
变成
file?(1|Foo) file?(2|Foo)
然后两个参数都是通配符。
仅使用如下扩展按预期工作,但会出错 nullglob
等:
file{{1..2},Foo}
它被解释为:
ls file?(1|Foo) file?(2|Foo)
范围正在扩大,然后每个值与|Foo
合并。
因此,当展开每个模式时,您会得到以数字结尾的文件和以 Foo
结尾的文件。
尝试:
ls file{{1..2},Foo)