gpt4 book ai didi

bash - extglob 如何与 shell 参数扩展一起工作?

转载 作者:行者123 更新时间:2023-12-03 19:46:13 24 4
gpt4 key购买 nike

我以为我理解了可选 的用法?(pattern-list) bash (当 extglob shell 选项打开时)并且默认在 ksh .例如在 bash :

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

但是当 匹配前缀模式 只是一个 ?()或一个 *() ,其中介绍了我所说的 可选图案 , 35除非 ,否则不会被省略## 用来:
$ 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

?() 报告相同的行为时和 *()用于 匹配后缀模式 (使用 %%% ):
$ 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 机制。

有人可以解释一下吗?

提前致谢

最佳答案

如果您使用 @而不是 ?然后它按预期工作:

$> 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) # 匹配 或多个给定模式的出现
  • 关于bash - extglob 如何与 shell 参数扩展一起工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39445699/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com