Syntax error =~ operator in msysgit bash

后端 未结 4 1898
迷失自我
迷失自我 2020-12-18 19:40

I\'m trying to add a function to my bash_profile for msysgit:

function git-unpushed {
    brinfo=$(git branch -v | grep git-branch-name)
    if          


        
相关标签:
4条回答
  • 2020-12-18 19:53

    According to https://groups.google.com/forum/#!topic/msysgit/yPh85MPDyfE this is because msys doesn't ship libregex along with bash. Supposedly if you compile/find an msys built libregex, and put it in the library path, =~ starts working fine.

    0 讨论(0)
  • 2020-12-18 20:06

    I had the same error on Bash 3.1.0 from Git installation on Windows. Ultimately I changed it to:

    if echo $var | grep -E 'regexp' > /dev/null
    then
      ...
    fi
    
    0 讨论(0)
  • 2020-12-18 20:06

    Here is a solution that supports extracting matched strings. If the operator =~ is not supported by bash, then the sed command is used (installed with msysgit)

    if eval "[[ a =~ a ]]" 2>/dev/null; then
        regexMatch() { # (string, regex)
            eval "[[ \$1 =~ \$2 ]]"
            return $?
        }
    elif command -v /bin/sed >/dev/null 2>&1; then
        regexMatch() { # (string, regex)
            local string=$1
            if [[ ${2: -1} = $ ]]; then
                local regex="(${2%$})()()()()()()()()$"
            else
                local regex="($2)()()()()()()()().*"
            fi
            regex=${regex//\//\\/}
            local replacement="\1\n\2\n\3\n\4\n\5\n\6\n\7\n\8\n\9\n"
            local OLD_IFS=$IFS
            IFS=$'\n'
            BASH_REMATCH=($(echo "$string" | /bin/sed -rn "s/$regex/$replacement/p" | while read -r; do echo "${REPLY}"; done))
            IFS=$OLD_IFS
            [[ $BASH_REMATCH ]] && return 0 || return 1
        }
    else
        error "your Bash shell does not support regular expressions"
    fi
    

    Usage example:

    if regexMatch "username@host.domain" "(.+)@(.+)"; then
        echo ${BASH_REMATCH[0]}
        echo ${BASH_REMATCH[1]}
        echo ${BASH_REMATCH[2]}
    fi
    
    0 讨论(0)
  • 2020-12-18 20:10

    Update 2015: msysgit is now obsolete.
    You should use the bash which comes with git-for-windows.
    As mentioned in this answer, it uses a much more recent bash (4.3+), for which the =~ syntax will work.


    Original answer (march 2013)

    The bash packaged with msysgit might simply be too old to fully support this operator.
    It is certainly too old to compare with unquoted regex, as mentioned in "Bash, version 3" and "How do I use regular expressions in bash scripts?":

    As of version 3.2 of Bash, expression to match no longer quoted.

    Actually, mklement0 mentions in the comments:

    =~ was introduced in bash 3.0 and always supported an unquoted token on the RHS.
    Up to 3.1.x, quoted tokens were treated the same as unquoted tokens: both were interpreted as regexes.
    What changed in 3.2 was that quoted tokens (or quoted substrings of a token) are now treated as literals.

    But I tried with quotes (in the latest msysgit 1.8.1.2), and it still fails:

    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 /
    
    0 讨论(0)
提交回复
热议问题