基本通配符扩展与扩展通配符扩展相结合

问题描述 投票:0回答:1

我试图了解扩展通配符扩展的工作原理,但遇到了以下问题。

在我当前的目录

~/t
中,我有两个文件,名为
chair
table
。对于 Bash shell,命令
ls *(a-z)*
会列出它们,但
ls *(a-z)
不会列出。为什么?我已使用
shopt -s extglob
启用了扩展通配符。

我猜

ls *(a-z)
无法列出这两个文件,因为在这种情况下,
*
将扩展到 0+ 个字符,如基本通配符扩展一样,然后
(a-z)
不会扩展到任何内容。如果
(a-z)
没有扩展为任何内容,Bash 将尝试按字面匹配它。由于我当前目录中没有以
(a-z)
结尾的文件,因此命令
ls
在这种情况下会失败并且不会列出任何内容。

但是,根据我之前的推理,表达式

*(a-z)*
应该仅匹配以任意 0+ 个字符开头、后跟文字“(a-z)”、后跟 0+ 个字符的文件名。但情况似乎并非如此,因为
ls *(a-z)*
确实列出了我的文件
chair
table

~/t$ ls 
chair  table

~/t$ ls *(a-z)*
chair  table

~/t/$ ls *(a-z)
ls: cannot access '*(a-z)': No such file or directory
bash wildcard glob
1个回答
0
投票

因为 shell 需要方括号,而不是圆括号:

printf '%s\n' *[a-z]

产量:

chair
table
© www.soinside.com 2019 - 2024. All rights reserved.