Regex Bash正则表达式在Ubuntu上匹配,但在macOS上不匹配

Regex Bash正则表达式在Ubuntu上匹配,但在macOS上不匹配,regex,bash,Regex,Bash,我有以下bash脚本: #!/bin/bash git_status="$(git status 2>/dev/null)" branch_pattern="^(# |)On branch ([^${IFS}]*)" echo $git_status echo $branch_pattern if [[ ${git_status} =~ ${branch_pattern} ]]; then echo 'hello' echo $BASH_REMATCH fi 下面是我

我有以下bash脚本:

#!/bin/bash

git_status="$(git status 2>/dev/null)"
branch_pattern="^(# |)On branch ([^${IFS}]*)"
echo $git_status
echo $branch_pattern

if [[ ${git_status} =~ ${branch_pattern} ]]; then
    echo 'hello'
    echo $BASH_REMATCH
fi
下面是我在Ubuntu上使用
bash
Version4运行脚本时的输出:

On branch master Initial commit Untracked files: (use "git add <file>..." to include in what will be committed) test.sh nothing added to commit but untracked files present (use "git add" to track)
^(# |)On branch ([^ ]*)
hello
On branch master
对分支主控初始提交未跟踪文件:(使用“git add…”包含在将要提交的内容中)test.sh未添加任何内容以提交,但存在未跟踪文件(使用“git add”跟踪)
^(#|)在分支([^]*)上
你好
论分行行长
但是,当我使用bash版本3在macOS上运行相同的脚本时,regex不匹配,如果执行
块,则
中没有任何内容。其余的输出是相同的。我错过了什么?在这个版本的bash中,我的正则表达式是否需要在macOS/上进行不同的格式化?我丢了一面旗吗


我看到过类似的帖子,内容涉及不同平台的正则表达式行为差异,例如
find
命令,但我还没有找到与我的问题相关的帖子

如果您只想获取当前的git分支名称,则不需要regex。Git已经内置了这个功能

git rev parse--abbrev ref HEAD 2>/dev/null

这将打印出当前分支名称(如果有)
如果您在没有任何提交的git存储库中,它将只返回“HEAD”

如果您只是尝试获取当前git分支名称,则不需要正则表达式。Git已经内置了这个功能

git rev parse--abbrev ref HEAD 2>/dev/null

这将打印出当前分支名称(如果有)
如果您在没有任何提交的git存储库中,它将只返回“HEAD”

在我看来,macOS附带的bash版本中的重新引擎中似乎有一个bug(它相当旧——3.2.57)。这与
^(#|)
部分有关——它似乎与字符串开头的空字符串不匹配。但我找到了一个解决办法。显然,如果
^
位于括号内,则不会发生错误,如下所示:

branch_pattern="(^# |^)On branch ([^${IFS}]*)"

顺便说一句,您不应该使用
echo$varname
打印变量的内容。首先,它将对值进行分词(将所有的空格转换为单个空格)和通配符扩展,这可能会非常混乱/误导。请尝试类似于
printf'\n'$varname“
的方法。如果变量包含奇怪的字符,那么它的输出可能有点神秘,但至少它可以清楚地表明其中有奇怪的东西。

在我看来,macOS附带的bash版本中的RE引擎中似乎有一个bug(它相当旧——3.2.57)。这与
^(#|)
部分有关——它似乎与字符串开头的空字符串不匹配。但我找到了一个解决办法。显然,如果
^
位于括号内,则不会发生错误,如下所示:

branch_pattern="(^# |^)On branch ([^${IFS}]*)"

顺便说一句,您不应该使用
echo$varname
打印变量的内容。首先,它将对值进行分词(将所有的空格转换为单个空格)和通配符扩展,这可能会非常混乱/误导。请尝试类似于
printf'\n'$varname“
的方法。如果变量包含奇怪的字符,它的输出可能有点神秘,但至少它会清楚地表明其中有奇怪的东西。

这里想要的结果是什么?似乎您只需要当前的分支名称(如果有)?@Jebby基本上是的。出于这个问题的目的,我希望在Ubuntu的示例输出中得到相同的结果,但是在macOS上。它可能不是RE,它可能是git
。我刚刚在3.2和4.4版本的OSX上运行了您的脚本,得到了相同的输出,但没有找到匹配项。原因是,
$git\u status
是空的,因为它失败了-关闭
2>/dev/null
重定向,您将看到。@cdarke有趣!但对我来说,
$git_status
在两个平台上都不是空的。在Ubuntu和macOS上,它都给了我期望的状态。这里期望的结果是什么?似乎您只需要当前的分支名称(如果有)?@Jebby基本上是的。出于这个问题的目的,我希望在Ubuntu的示例输出中得到相同的结果,但是在macOS上。它可能不是RE,它可能是git
。我刚刚在3.2和4.4版本的OSX上运行了您的脚本,得到了相同的输出,但没有找到匹配项。原因是,
$git\u status
是空的,因为它失败了-关闭
2>/dev/null
重定向,您将看到。@cdarke有趣!但对我来说,
$git_status
在两个平台上都不是空的。在Ubuntu和macOS上,它都给了我期望的状态。这是有用的信息,但我真正想弄明白的是为什么同一个正则表达式在不同平台上不匹配相同的文本。好的,我道歉。我已经有一段时间没有使用Mac了,所以我不想在这方面提供虚假信息。但是,你确实说你在Mac上运行Bash3,在Ubuntu上运行Bash4。您是否有可能升级bash,或者这是不可能的?我没有考虑升级bash,但我确实想到了这一点。如果有可能的话,这对我来说风险太大了,因为这台计算机是我的工作计算机,我不想冒险破坏我的开发环境。幸运的是,上面被接受的答案对我有效!我可能会重构我的脚本以使用
git rev parse--abbrev ref HEAD 2>/dev/null
!这是有用的信息,但我真正想弄明白的是为什么同一个正则表达式在不同平台上不匹配相同的文本。好的,我道歉。我已经有一段时间没有使用Mac了,所以我不想在这方面提供虚假信息。但是,你确实说你在Mac上运行Bash3,在Ubuntu上运行Bash4。您是否有可能升级bash,或者这是不可能的?我没有考虑升级bash,但我确实想到了这一点。如果可能的话