msysgit bash中的语法错误=〜运算符

Aar*_*ush 21 windows bash msysgit

我正在尝试bash_profile添加一个函数:

function git-unpushed {
    brinfo=$(git branch -v | grep git-branch-name)
    if [[ $brinfo =~ ("[ahead "([[:digit:]]*)]) ]]
    then
        echo "(${BASH_REMATCH[2]})"
    fi
}
Run Code Online (Sandbox Code Playgroud)

但是我收到以下错误:

bash:条件二元运算符expected`

bash:语法错误附近 =~'

从我能找到的,"equals tilde"operator(=~)在bash中评估为正则表达式.

为什么会=~抛出错误?

更新:这是手动输入它的截图(这是运行sh.exe):

equals tilde(=〜)运算符失败的屏幕截图

Luk*_*ski 26

从Windows上的Git安装我在Bash 3.1.0上遇到了同样的错误.最终我改为:

if echo $var | grep -E 'regexp' > /dev/null
then
  ...
fi
Run Code Online (Sandbox Code Playgroud)

  • 这适用于简单的情况,但不适用于捕获组. (9认同)

Eri*_*ris 13

根据https://groups.google.com/forum/#!topic/msysgit/yPh85MPDyfE,这是因为msys没有随bash一起发布libregex.据说如果你编译/找到一个msys构建的libregex,并把它放在库路径中,=~开始工作正常.


Von*_*onC 7

2015年更新:msysgit现已过时.
你应该使用git-for-windows附带的bash .
正如在这个答案中提到的,它使用了更新的bash(4.3+),=~语法将起作用.


原始答案(2013年3月)

使用msysgit打包的bash可能太旧而无法完全支持此运算符.
这当然太老了与不带引号的正则表达式进行比较,如" Bash,版本3 "和" 如何在bash脚本中使用正则表达式? "中所述:

从Bash版本3.2开始,表达式不再引用匹配.

实际上,mklement0在评论中提到:

=~在bash 3.0中引入并始终支持RHS上的未加引号的标记.
高达3.1.x,引用的令牌被视为与未引用的令牌相同:两者都被解释为正则表达式.
3.2中的变化是引用的令牌(或令牌的引用子串)现在被视为文字.

但我尝试使用引号(在最新的msysgit 1.8.1.2中),它仍然失败:

vonc@voncvb /
$ /bin/bash --version
GNU bash, version 3.1.0(1)-release (i686-pc-msys)
Copyright (C) 2005 Free Software Foundation, Inc.
vonc@voncvb /
$ variable="This is a fine mess."
vonc@voncvb /
$ echo "$variable"
This is a fine mess.
vonc@voncvb /
$ if [[ "$variable" =~ T.........fin*es* ]] ; then echo "ok" ; fi
bash: conditional binary operator expected
bash: syntax error near `=~'
vonc@voncvb /
$ if [[ "$variable" =~ "T.........fin*es*" ]] ; then echo "ok" ; fi
bash: conditional binary operator expected
bash: syntax error near `=~'
vonc@voncvb /
Run Code Online (Sandbox Code Playgroud)