extglob如何使用shell参数扩展?

时间:2016-09-12 07:55:55

标签: bash pattern-matching ksh prefix suffix

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

$ shopt -s extglob
$ V=35xAB
$ echo "${V#?(35|88)x}" "${V#35}"
AB xAB

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

##

在{strong>匹配后缀模式(使用$ 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 ?())中使用*()%时,会报告相同的行为:< / p>

%%

我在$ 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 版本3.2.25,4.1.2和4.1.6中测试了这个问题,这让我觉得,或许,我没有正确理解匹配模式的实际底层shell机制。 / p>

可能有人对此有所了解吗?

提前致谢

1 个答案:

答案 0 :(得分:1)

如果您使用@代替?,那么它会按预期运行:

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

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

+而不是*的行为类似:

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

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

这是因为:

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

  • *(pattern-list)#匹配或更多出现的给定模式
  • +(pattern-list)#匹配一个或多次出现的给定模式