我正在尝试使用 extglob,但是,在阅读手册页之后,我对 *(patternList) 的操作方式感到困惑。假设我使用以下命令:
touch A Ax Axxx Axxxx Ay X X.bak x xx xxxx
ls A*(xx)
为什么这只打印 A Axxxx. Axxx 不是也恰好包含一次 xx 吗?此外,为什么 Ay 没有被打印,因为它出现了 0 次 xx?
答案1
该模式必须与整个名称匹配,而不仅仅是名称的前缀。
Ay
不匹配,A*(xx)
因为它不包含A
后跟任意数量的xx
。y
与模式不匹配。Ay
确实匹配A*(xx)y
和A*(xx)?
。A*(xx)*
同样,Axxx
不匹配,A*(xx)
因为它不包含A
后跟任何数量的xx
。Axxx
确实匹配A*(x)
(A
后跟 3 次x
)、A*(xx)x
(A
后跟 1 次xx
后跟x
)、A*(xx)?
、A*(xx)*
等。
答案2
Axxx 不是也恰好包含一次 xx 吗?
确实如此,但它还有一个x
与模式不匹配的附加内容A*(xx)
。它将被A*(xx)?
例如匹配。
此外,为什么 Ay 没有被打印,因为它出现了 0 次 xx?
同样,因为模式中没有任何内容与尾随y
.
我想归根结底是 glob 是整个字符串火柴。