当脚本文件来自 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_REMATCH
在 zsh
中不存在的知识,我做了更多的挖掘:
这个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[]?
所以我为自己创建了一个可爱的小 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_REMATCH
在 zsh
中不存在的知识,我做了更多的挖掘:
这个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[]?