首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >extglob如何使用shell参数展开?

extglob如何使用shell参数展开?
EN

Stack Overflow用户
提问于 2016-09-12 07:55:55
回答 1查看 424关注 0票数 5

我以为我理解了可选?(pattern-list)bash中(当extglob shell选项是on)和默认情况下在ksh中的使用。例如,在bash

代码语言:javascript
复制
$ shopt -s extglob
$ V=35xAB
$ echo "${V#?(35|88)x}" "${V#35}"
AB xAB

但是,当匹配前缀模式只是一个?()或一个*() (这引入了我所说的可选模式)时,除非使用,否则不会省略35

代码语言:javascript
复制
$ echo "${V#?(35|88)}" "${V#*(35|88)}"    # Why 35 is not left out?
35xA 35xA
$ echo "${V##?(35|88)}" "${V##*(35|88)}"  # Why is it omitted when ## is used?
xA xA

?()*()匹配后缀模式(使用%%%)中使用时,也会报告相同的行为:

代码语言:javascript
复制
$ echo "${V%5?(xA|Bz)}"                   # 5xA is omitted
3
$ echo "${V%?(xA|Bz)}" "${V%*(xA|Bz)}"    # why xA is not left out?
35xA 35xA
$ echo "${V%%?(xA|Bz)}" "${V%%*(xA|Bz)}"  # xA is omitted when %% is used
35 35

我在bash版本3.2.25、4.1.2和4.1.6中测试了这个问题,这让我认为,也许我还没有正确理解匹配模式的实际底层shell机制。

有人能解释一下这件事吗?

提前感谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-12 08:09:06

如果您使用的是@而不是?,那么它就会像预期的那样工作:

代码语言:javascript
复制
$> echo "${V#@(35|88)}"
xAB

$> echo "${V%@(xAB|Bzh)}"
35

类似于+而不是*的行为

代码语言:javascript
复制
$> echo "${V#*(35|88)}"
35xAB

$>echo "${V#+(35|88)}"
xAB

这是因为:

  • ?(pattern-list) #匹配或给定模式的一次出现
  • @(pattern-list) #匹配给定模式的一个

和:

  • *(pattern-list) #匹配或更多给定模式的出现
  • +(pattern-list) #匹配一个或多个给定模式的出现
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39445699

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档