2016-04-20 13 views
1
#!/bin/bash 
i="a001" 
if ! [[ $i =~ "a[0-9]{3}" ]]; then 
    echo "success" 
fi 

Eingang i="a001" macht es Erfolg, obwohl es Spiel tut a[0-9]{3} Muster und if Anweisung nicht ausgeführt werden sollte. Was ist los? Meiner Meinung nach ist es Compilerfehler. Es ist ein Teil eines größeren Problems, das ich seit gestern nicht gelöst habe.Fehler des Bash-Compilers? was los ist

+3

'bash 'ist kein Compiler - es ist ein Interpreter –

+0

okay, aber was ist los mit meinem regulären Ausdruck? keine solchen Probleme in anderen Sprachen wie PHP – user3162968

+3

Das 'if!' sieht sehr ähnlich wie _IF NOT_ zu mir, Echo 'Erfolg' nur bei einem Fehler? – sln

Antwort

3

Zitate entkommen die Metazeichen in der Regex und sollten daher hier nicht enthalten sein.

$ i="a001" 
$ [[ $i =~ "a[0-9]{3}" ]] ; echo $? 
1 
$ [[ $i =~ a[0-9]{3} ]] ; echo $? 
0 
+0

Ich denke, das ist richtig, aber ein bisschen irreführend aufgrund dessen, wie es formuliert ist. "Keine Anführungszeichen erforderlich" bedeutet, dass Anführungszeichen überflüssig sind, dh es ist in Ordnung, zu zitieren, solange Sie nichts gegen eine zusätzliche Eingabe haben. Wie der Code zeigt, ist das falsch, die Zitate sind falsch. Deine Antwort erklärt noch nicht wirklich warum. – hvd

+0

Wow, ich würde gerne sehen, wie sie diese Trennzeichen um die Argumente parsen, besonders da Regex so metakribiert wird. – sln

+0

es scheint zu funktionieren, danke, ich konnte diese Übung seit gestern nicht lösen – user3162968

4

Für konsistentes Verhalten in allen bash-Versionen einen =~ Operator in [[ ]] mit, setzen Sie Ihre Regex in einer Variablen und verwenden Sie die Variable nicht notierte auf der rechten Seite der Betreiber:

i="a001" 
re="a[0-9]{3}" 
if ! [[ $i =~ $re ]]; then 
    echo "success" 
fi