personalizar customize custom windows bash msysgit

windows - customize - Error de sintaxis=~ operador en msysgit bash



git bash themes windows (4)

Estoy tratando de agregar una función a mi bash_profile para msysgit :

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

Pero me sale el siguiente error:

bash: se espera un operador binario condicional`

bash: error de sintaxis cerca =~''

Por lo que puedo encontrar, el operador "es igual a tilde" ( =~ ) se evalúa como expresiones regulares en bash.

¿Por qué es =~ está lanzando un error?

ACTUALIZACIÓN: Aquí hay una captura de pantalla de la introducción manual (esto está ejecutando sh.exe):


Actualización 2015: msysgit ahora está obsoleto.
Deberías usar el bash que viene con git-for-windows .
Como se mencionó en esta respuesta , usa un bash mucho más reciente (4.3+), para el cual funcionará la sintaxis =~ .

Respuesta original (marzo 2013)

El bash empaquetado con msysgit puede ser simplemente demasiado viejo para soportar completamente a este operador.
Sin duda es demasiado viejo para comparar con expresiones regulares no cotizadas , como se menciona en " Bash, versión 3 " y " ¿Cómo uso expresiones regulares en los scripts de bash? ":

A partir de la versión 3.2 de Bash, la expresión para coincidir ya no se cita.

En realidad, mklement0 menciona en los comentarios:

=~ se introdujo en bash 3.0 y siempre admitió un token sin comillas en el RHS.
Hasta 3.1.x, los tokens citados se trataron de la misma manera que los tokens no citados: ambos se interpretaron como expresiones regulares.
Lo que cambió en 3.2 fue que los tokens citados (o las subseries citadas de un token) ahora se tratan como literales .

Pero lo intenté con comillas (en el último msysgit 1.8.1.2), y todavía falla:

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 /


Aquí hay una solución que admite la extracción de cadenas coincidentes. Si bash no admite el operador = ~, entonces se usa el comando sed (instalado con 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

Ejemplo de uso:

if regexMatch "[email protected]" "(.+)@(.+)"; then echo ${BASH_REMATCH[0]} echo ${BASH_REMATCH[1]} echo ${BASH_REMATCH[2]} fi



Tuve el mismo error en Bash 3.1.0 de la instalación de Git en Windows. Finalmente lo cambié a:

if echo $var | grep -E ''regexp'' > /dev/null then ... fi