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

Why does BASH_REMATCH return empty when the script file is sourced from zsh?

所以我为自己创建了一个可爱的小 bash 脚本:

#!/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,那么我得到的结果是:

Matched BAR

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

瓦特

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

任何人都可以解释这种违规行为吗?

当您使用 . 读取文件时,它会被任何 shell 您 运行 执行 - 在这种情况下,您说您在 zsh 中。 BASH_REMATCH数组的名字,顾名思义,是bash特有的;例如,如果您的 shell 是 zsh,那么在这种情况下匹配的文本将在 $match[1] 中找到。而且我认为 ksh 根本不进行真正的正则表达式匹配。

现在,有了 BASH_REMATCHzsh 中不存在的知识,我做了更多的挖掘:

这个post实际上是一个副本。这里还有另一个问题解释了解决方案:

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

使上述脚本与 zsh 兼容的简单方法是:

#!/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[]?