我有以下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
版本4在Ubuntu上运行脚本时的输出:
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
但是,当我使用bash版本3在macOS上运行相同的脚本时,正则表达式不匹配,并且if
块内没有任何内容被执行。其余的输出是相同的。我错过了什么?在这个版本的bash中,我的正则表达式是否需要在macOS /上进行不同的格式化?有没有我失踪的旗帜?
我已经看过类似帖子,关于跨平台的正则表达式行为的差异,例如find
命令,但我还没有找到与我的问题相关的帖子。
答案 0 :(得分:1)
如果您只是想获取当前的git分支名称,则不需要正则表达式。 Git已经内置了这个。
git rev-parse --abbrev-ref HEAD 2>/dev/null
这将打印出当前的分支名称(如果有的话) 如果您在没有任何提交的git存储库中,它将只返回&#34; HEAD&#34;
答案 1 :(得分:1)
在我看来,在macOS附带的bash版本的RE引擎中存在一个错误(它相当陈旧 - 3.2.57)。它与^
部分有关 - 它似乎与字符串开头的空字符串不匹配,因为它应该如此。但我找到了一个解决方法。显然,如果branch_pattern="(^# |^)On branch ([^${IFS}]*)"
在括号内,则不会发生错误,如下所示:
echo $varname
顺便说一句,你不应该使用printf '<<%q>>\n' "$varname"
来打印变量的内容。首先,它会进行单词拆分(将所有空白空间转换为单个空格)和值上的通配符扩展,这可能非常混乱/误导。尝试使用类似create
的内容。如果变量包含奇怪的字符,它的输出可能有点神秘,但至少它会清楚地表明那里有 奇怪的东西。