2008-11-20 9 views
78

Ich möchte prüfen, ob eine Variable ein gültiges Jahr mit einem regulären Ausdruck hat. Lesen Sie die bash manual Ich verstehe, ich könnte den Operator verwenden = ~Wie verwende ich reguläre Ausdrücke in Bash-Skripten?

Betrachtet man das Beispiel unten, würde ich erwarten, "nicht OK" zu sehen, aber ich sehe "OK". Was mache ich falsch?

i="test" 
if [ $i=~"200[78]" ] 
then 
    echo "OK" 
else 
    echo "not OK" 
fi 
+0

möglich Duplikat [bash regex mit Zitaten?] (Http: // stackoverflow.com/questions/218156/bash-regex-with-quotes) – outis

+0

Beachten Sie, dass dies wegen des Fehlens von Leerzeichen um '= ~' fehlgeschlagen ist. – fedorqui

Antwort

111

Es wurde zwischen 3.1 und 3.2 geändert:

Dies ist eine knappe Beschreibung der neuen Features der Version von bash-3.1 bash-3.2 da.

Das Angeben des Zeichenfolgenarguments an den [[Befehl == Operator] erzwingt jetzt wie bei den anderen Musteranpassungsoperatoren die Zeichenfolgenabgleichung.

es also ohne die Anführungszeichen verwenden also:

i="test" 
if [[ $i =~ 200[78] ]] ; then 
    echo "OK" 
else 
    echo "not OK" 
fi 
+1

Wie gehe ich mit der Situation um, wenn die Regex Leerzeichen enthält, wenn ich nicht angeben kann? Wenn die Regex z.B. 'a + b' wird einen Syntaxfehler melden ... – Alderath

+5

@Alderath: Verwende' a \ \ + b', um das Leerzeichen und das Pluszeichen zu entfernen. – blinry

8

Sie müssen Räume um den Operator = ~

 
i="test" 
if [[ $i =~ "200[78]" ]]; 
then 
    echo "OK" 
else 
    echo "not OK" 
fi 
+2

paxdiablos Antwort ist richtig, das Hinzufügen von Leerzeichen hier hilft nicht (Sie erhalten jetzt auch "nicht OK" für 2008, die einzige Zeichenfolge, die gefunden wird, ist buchstäblich "200 [78]"). –