Bash 为什么这个模式与'ab'匹配,而与'ba'不匹配?
我在bash中摆弄了一下,但是反向匹配器Bash 为什么这个模式与'ab'匹配,而与'ba'不匹配?,bash,pattern-matching,Bash,Pattern Matching,我在bash中摆弄了一下,但是反向匹配器有些奇怪!(图案)。考虑下面的例子 $ 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" 在第三种
有些奇怪!(图案)
。考虑下面的例子
$ 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) -> ""
但看起来这不管用
即使考虑到贪婪,这对我来说也没有任何意义。我错过了什么
编辑:我在GNUBash上,版本4.1.7(2)-发行版(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.
这项工作:()用于消除歧义
echo @(*a*)!(a)
echo !(a)@(*a*)
奇怪:*a*!(a) c
,匹配abc
和bac
(这是正常行为)这是一个
切特·拉米写道[…]这将在下一版本中修复
在
gnubash,版本4.1.5(1)-发行版(x86_64-pc-linux-GNU)
上也有同样的行为,现在,我假设这是bash中的一个bug。我的错误报告: