我在Bash 5.1发行说明上读到
p. BASH_REMATCH不再是只读的。
正如Bash参考手册中所解释的那样
数组变量BASH_REMATCH记录字符串的哪些部分与模式匹配。索引为0的BASH_REMATCH元素包含字符串中与整个正则表达式匹配的部分。正则表达式中由括号大小的子表达式匹配的子字符串保存在其余的BASH_REMATCH索引中。索引为n的BASH_REMATCH元素是字符串中匹配第n个括号大小子表达式的部分。
是的,访问正则表达式的匹配非常有用:
$ DESERT=pie-cake_berry_cream-sirup
$ [[ $DESERT =~ _(.*)_ ]] && echo "${BASH_REMATCH[1]}"
berry然而,我看不出这条新闻在Bash 5.1中有什么用。也就是说,BASH_REMATCH不被读取有什么意义?
发布于 2021-01-12 13:53:15
在这个bug bash邮件列表线程中,bashdb ( Bash调试器)的维护者解释说,BASH_REMATCH的值在调试钩子中可能会发生变化,并且由于变量是只读的,因此通过运行重新设置它的命令来重置它,这很棘手,而且很脆弱:
当前在bash5.0和更早版本中,BASH_REMATCH的值可能会在调试钩子中出现。 由于BASH_REMATCH是只读的,重新设置钩子上的值返回到调试程序是有点棘手和脆弱的. ..。 bashdb当前重置BASH_REMATCH的方式是重新发出导致最初设置值的命令。这是脆弱的,因为从设置BASH_REMATCH到上次使用它的时间之间的出口设置是脆弱的。在正则表达式中使用的变量之间可能发生了更改。 ..。 恢复它也同样棘手。我希望你们看到这一切都有点脆弱。
在响应中,Chet提供了使其不是只读的:
不如我们让它不是只读的好吗?shell在执行regexp匹配时仍然会设置它。
https://stackoverflow.com/questions/65669036
复制相似问题