加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

bash – 为什么这个模式匹配`ab`,而不是’ba`?

发布时间:2020-12-16 01:14:14 所属栏目:安全 来源:网络整理
导读:我在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? 我假设在第二个例子
我在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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读