2016-06-14 23 views
6

Si consideri il codice qui sotto:Bash doppie parentesi quadre regex partita problema

$ var1=bingo 
$ var2=.ingo 
$ if [[ "$var1" =~ $var2 ]]; then echo found; fi 
found 
$ if [[ $var1 =~ "$var2" ]]; then echo found; fi # line 5 
$ if [[ "$var1" =~ "$var2" ]]; then echo found; fi # line 6 
$ if [[ $var1 =~ $var2 ]]; then echo found; fi 
found 

Sopra è quello che ho fatto nella shell bash.

domanda è: perché non l'ha fatto linee 5 e 6 stampa found?

Penso so già la risposta, ma cerco per un semplice facile da digerire risposta.

Per concludere, quando una variabile (all'interno di virgolette doppie) viene utilizzata sul lato destro di =~, le doppie virgolette servono solo per l'espansione variabile?

+1

@fedorqui: Grazie per la modifica, il modo migliore per dirla in effetti – sjsam

+4

Qualsiasi parte dell'operando a destra di '= ~' quotata corrisponde a una stringa letterale. –

+0

Eventuali duplicati di [Perché non possono stringhe letterali essere utilizzati in bash test espressioni regolari?] (Http://stackoverflow.com/questions/6665529/why-cant-string-literals-be-used-in-bash-regular -expression-test) –

risposta

7

Supponendo che si sta eseguendo Bash 3.2 o più recente, il bash manual (scorrere verso il basso alla descrizione del [[…]]) afferma:

Qualsiasi parte del modello può essere quotato per forzare la parte quotata ad essere abbinata come una stringa.

Ed inoltre:

Se il modello è memorizzato in una variabile shell, citando l'espansione variabile costringe l'intero modello da abbinare come stringa.

Prima di Bash 3.2, l'esempio fornito avrebbe funzionato come previsto.

+0

In realtà, ho letto questo, ma è stato un po 'di confusione. L'espansione variabile ha ancora luogo. Ho ragione? – sjsam

+1

Sì, ma poi il paragone non regge come 'bingo! = .ingo' –

+0

meraviglioso e grazie per la modifica. È interessante notare che ho perso la parte è stato evidenziato nel montaggio .. – sjsam

2

Quando si utilizza le virgolette, il modello ampliato viene trattato alla lettera. Quindi lo . viene effettivamente trattato letteralmente, non come un token Regex, cioè un singolo carattere.

Esempio:

$ if [[ $var1 =~ "$var2" ]]; then echo found; fi 
+ [[ bingo =~ \.ingo ]] 

$ if [[ $var1 =~ $var2 ]]; then echo found; fi 
+ [[ bingo =~ .ingo ]] 
+ echo found 
found 
Problemi correlati