2012-06-26 23 views
15

Parece que es una especie de operador de comparación, pero ¿qué es exactamente lo que hace en, por ejemplo, el siguiente código (tomado de https://github.com/lvv/git-prompt/blob/master/git-prompt.sh#L154)?¿Qué hace el operador "= ~" en scripts de shell?

if [[ $LC_CTYPE =~ "UTF" && $TERM != "linux" ]]; then 
      elipses_marker="…" 
    else 
      elipses_marker="..." 
    fi 

Estoy intentando actualmente hacer git-prompt para trabajar bajo MinGW, y la caja suministrada con MinGW no parece apoyar este operador:

conditional binary operator expected 
syntax error near `=~' 
`  if [[ $LC_CTYPE =~ "UTF" && $TERM != "linux" ]]; then' 

En este caso específico que sólo puede sustituir todo el bloque con elipses_marker="…" (como sé que mi terminal admite unicode), pero ¿qué es exactamente lo que =~ hace?

Respuesta

10

Es una fiesta de sólo Además del comando incorporado [[, realizar la coincidencia de expresiones regulares. Como no tiene que ser una coincidencia exacta de la cadena completa, el símbolo se agita, para indicar una coincidencia "inexacta".

En este caso, si $LC_CTYPECONTIENE la cadena "UTF".

Más versión portátil:

if test `echo $LC_CTYPE | grep -c UTF` -ne 0 -a "$TERM" != "linux" 
then 
    ... 
else 
    ... 
fi 
+2

No hay necesidad de ejecutar grep en backticks. 'si echo $ LC_TYPE | grep -Fq UTF && test "$ TERM"! = linux; then' –

+0

Intentando alentar el código legible ... Lo encuentro más intuitivo con solo una 'prueba' y los backticks que rodean la primera" expresión ", haciendo que parezca una expresión. (Y grep -q sería cierto en un error también) :-) Pero estoy de acuerdo. Tengo el hábito de usar 'test' con demasiada frecuencia, pero creo que es más legible que' if: ing' a pipe. – MattBianco

+0

¿Qué quiere decir con "grep -q sería cierto también en un error"? –

2

Coincide con expresiones regulares

Consulte la siguiente ejemplo de http://tldp.org/LDP/abs/html/bashver3.html#REGEXMATCHREF

#!/bin/bash 

input=$1 


if [[ "$input" =~ "[0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9]" ]] 
#    ^NOTE: Quoting not necessary, as of version 3.2 of Bash. 
# NNN-NN-NNNN (where each N is a digit). 
then 
    echo "Social Security number." 
    # Process SSN. 
else 
    echo "Not a Social Security number!" 
    # Or, ask for corrected input. 
fi 
+2

Si cita la expresión regular (a partir de Bash 3.2) se convierte en una cadena literal en lugar de una expresión regular. –

3

como Ruby, que coincide en que el operando del lado derecho es una expresión regular.

6

Es una coincidencia de expresiones regulares. Supongo que tu versión bash aún no es compatible.

En este caso particular, me gustaría sugerir su sustitución por más simple (y más rápido) la coincidencia de patrones:

[[ $LC_CTYPE == *UTF* && $TERM != "linux" ]] 

(tenga en cuenta que * no podrá ser citado aquí)