2012-06-26 15 views
15

Sembra che sia una sorta di operatore di confronto, ma che cosa fa esattamente es. il seguente codice (preso da https://github.com/lvv/git-prompt/blob/master/git-prompt.sh#L154)?Cosa fa l'operatore "= ~" negli script di shell?

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

Attualmente sto cercando di fare git-prompt a lavorare sotto MinGW, e la shell fornita con MinGW non sembra sostenere questo operatore:

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

In questo caso specifico posso solo sostituire l'intero blocco con elipses_marker="…" (come so che il mio terminale supporta l'unicode), ma cosa fa esattamente questo =~?

risposta

10

Si tratta di una festa per soli aggiunta al comando integrato [[, eseguendo la corrispondenza delle espressioni regolari. Poiché non deve essere una corrispondenza esatta della stringa intera, il simbolo viene sventolato, per indicare una corrispondenza "inesatta".

In questo caso, se $LC_CTYPECONTAINS la stringa "UTF".

Più versione portatile:

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

Non è necessario eseguire grep in backtick. 'se echo $ LC_TYPE | grep -Fq UTF && test "$ TERM"! = linux; then' –

+0

Cercando di incoraggiare il codice leggibile ... Trovo più intuitivo con un solo 'test' e gli apici invocati che circondano la prima" espressione ", facendolo sembrare un'espressione. (E grep -q sarebbe vero anche su un errore) :-) Ma sono d'accordo. Ho l'abitudine di usare 'test' troppo spesso, ma penso che sia più leggibile di' if: ing' a pipe. – MattBianco

+0

Cosa intendi con "grep -q sarebbe true anche su un errore"? –

2

Si abbina le espressioni regolari

Fare riferimento al seguente esempio da 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

Se si cita l'espressione regolare (come di Bash 3.2) si trasforma in una stringa letterale, invece di una regex. –

3

come Ruby, corrisponde in cui l'operando RHS è un'espressione regolare.

6

È un abbinamento di espressioni regolari. Suppongo che la tua versione di bash non lo supporti ancora.

In questo caso particolare, io suggerirei sostituendolo con più semplice (e più veloce) pattern matching:

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

(si noti che * non deve essere citato qui)