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
Según https://groups.google.com/forum/#!topic/msysgit/yPh85MPDyfE esto se debe a que msys no se envía libregex junto con bash. Supuestamente, si compila / encuentra un msge creado en libregex, y lo pone en la ruta de la biblioteca, =~
comienza a funcionar bien.
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