2012-09-26 84 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(這是正常的行爲)

相關問題