2012-09-26 49 views
8

我在bash中摆弄extended globbing,但逆匹配器!(PATTERN)有一些奇怪之处。请看下面的例子为什么这个模式匹配`ab`,而不是`ba`?

$ 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, Version 4.1.7(2)-release (i386-apple-darwin10.4.0)

+0

在'GNU的bash,版本4.1.5(1)-release下(x86_64-PC-Linux的GNU) ' –

+0

相同的行为现在,我会认为这是一个猛砸错误。我的错误报告:https://groups.google.com/d/topic/gnu.bash.bug/KkQNOi8F7q4/discussion – user123444555621

回答

1

这确实是奇怪的。我可以重现你的行为。奇怪的是a字符后面的*。当我执行你的代码时:

$ 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. 
1

此作品:()加入到歧义

echo @(*a*)!(a) 
echo !(a)@(*a*) 

奇怪:*a*!(a)c,匹配abcbac(这是正常的行为)

相关问题