首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当脚本文件来自zsh时,为什么BASH_REMATCH返回为空?

当脚本文件来自zsh时,为什么BASH_REMATCH返回为空?
EN

Stack Overflow用户
提问于 2020-10-19 14:45:30
回答 2查看 671关注 0票数 1

所以我给自己创造了一个可爱的巴什脚本:

代码语言:javascript
复制
#!/usr/bin/env bash

TEXT="FOO BAR"
REGEX="FOO (.+)"

if [[ $TEXT =~ $REGEX ]]; then 
    echo "Matched ${BASH_REMATCH[1]}"
else
    echo "No match."
fi

很基本的。如果运行./cutescript.sh,就会得到结果:

代码语言:javascript
复制
Matched BAR

但是,如果我源脚本. ./cutescript.sh,那么它仍然匹配,但BASH_REMATCH[1是空的。

哇哦。

我在MacOS Catalina 10.15.7 (19H2)上,在zsh中执行此操作,但使用bash shebang。

有人能解释一下这种不规律吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-10-20 08:56:34

现在,由于我知道BASH_REMATCHzsh中根本不存在,我做了更多的调查:

这篇文章实际上是重复的。这里还有另一个问题解释了解决方案:BASH_REMATCH doesn't capture

设置选项KSH_ARRAYS BASH_REMATCH允许zsh模仿bash的正则表达式功能。

使上面的脚本与zsh兼容的一个简单方法是:

代码语言:javascript
复制
#!/usr/bin/env bash

# Ensures that BASH_REMATCH works if called in zsh.
setopt KSH_ARRAYS BASH_REMATCH

TEXT="FOO BAR"
REGEX="FOO (.+)"

if [[ $TEXT =~ $REGEX ]]; then 
    echo "Matched ${BASH_REMATCH[1]}"
else
    echo "No match."
fi

unsetopt KSH_ARRAYS BASH_REMATCH

还有另一个相关问题:What is the zsh equivalent for $BASH_REMATCH[]?

票数 2
EN

Stack Overflow用户

发布于 2020-10-19 15:21:39

当您使用.读取文件时,它将由您正在运行的任何shell执行--在本例中,您说您在zsh中。顾名思义,BASH_REMATCH数组的名称是特定于bash的;例如,如果您的shell是zsh,那么在本例中匹配的文本将在$match[1]中找到。我认为ksh根本没有真正的正则匹配。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64429740

复制
相关文章

相似问题

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