我在bash中摆弄了
extended globbing,但是反向匹配器有些奇怪!(PATTERN).请考虑以下示例
$touch ab ba $shopt -s extglob $echo *a* ab ba $echo !(a)*a* ab ba $echo *a*!(a) ab
现在它看起来像!()匹配空字符串,但为什么不* a *!(a)匹配ba?
我假设在第二个例子中,ab匹配是这样的
!(a) -> "" * -> "" a -> "a" * -> "b"
反过来会建议在第三种情况下匹配ba,就像这样
* -> "b" a -> "a" * -> "" !(a) -> ""
但看起来这样不起作用.
即使考虑贪婪,这对我也没有任何意义.我错过了什么?
编辑:
我正在使用GNU bash,版本4.1.7(2)-release(i386-apple-darwin10.4.0)
这确实很奇怪.我可以重现你的行为.奇怪的是一个角色背后的*.当我执行你的代码时:
$echo *a*!(a) ab
……就像你描述的那样.
但如果我跳过第二个*它匹配两个文件
$echo *a!(a) ab ba
这意味着您的匹配元素应该是正确的.问题是,为什么第二个星号与第一个示例中的空字符串不匹配.正如文档所说它应该匹配空字符串,但似乎这不正常.
也许我们的bash版本与文档不匹配?
$bash --version GNU bash,version 3.2.48(1)-release (x86_64-apple-darwin11) Copyright (C) 2007 Free Software Foundation,Inc.