2016-06-14 32 views
6

den Code unten vor:Bash doppelte eckige Klammern Regex Ausgabe

$ 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 

Oben ist, was ich in Bash-Shell getan haben.

Frage ist warum nicht Linien 5 und 6 Drucken ?

Ich denke, ich kenne bereits die Antwort, aber ich bin auf der Suche nach einer einfachen, leicht zu verdauen Antwort.

Abschließend, wenn eine Variable (in doppelten Anführungszeichen) auf der rechten Seite von =~ verwendet wird, dienen die doppelten Anführungszeichen nur für die variable Erweiterung?

+1

@fedorqui: Danke für die Bearbeitung, viel bessere Weise, es tatsächlich zu setzen – sjsam

+4

Jeder Teil des Operanden auf der rechten Seite von '= ~', die zitiert wird, wird als eine literale Zeichenfolge zugeordnet. –

+0

Mögliches Duplikat von [Warum können String-Literale nicht in bash-regulären Ausdruckstests verwendet werden?] (Http://stackoverflow.com/questions/6665529/why-cant-string-literals-be-used-in-bash-regular) -expression-tests) –

Antwort

7

Angenommen, Sie Bash 3.2 oder höher ausgeführt werden, die bash manual (nach unten scrollen, um die Beschreibung der [[…]]) heißt es:

Jeder Teil des Musters sein kann zitiert, um zu erzwingen, dass der zitierte Teil als String abgeglichen wird.

Und weiter:

Wenn das Muster in einem Shell-Variable gespeichert wird, das variable Expansions zitierte zwingt das gesamte Muster als String zusammengepaßt werden.

Vor Bash 3.2 hätte das von Ihnen bereitgestellte Beispiel wie erwartet funktioniert.

+0

Eigentlich habe ich das gelesen, aber es war ein bisschen verwirrend. Die variable Erweiterung findet immer noch statt. Habe ich recht? – sjsam

+1

Ja, aber dann schlägt der Vergleich fehl, wie 'Bingo! = .ingo' –

+0

Wunderbar und danke für die Bearbeitung. Interessanterweise habe ich den Teil vermisst, auf den Sie in der Bearbeitung hingewiesen haben. – sjsam

2

Wenn Sie doppelte Anführungszeichen verwenden, wird das erweiterte Muster wörtlich behandelt. So wird die . tatsächlich buchstäblich behandelt, nicht als ein Regex-Token, d. H. Irgendein einzelnes Zeichen.

Beispiel:

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

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