Wie verwende ich reguläre Ausdrücke in Bash-Skripten?

83

Ich möchte mithilfe eines regulären Ausdrucks überprüfen, ob eine Variable ein gültiges Jahr hat. Wenn ich das Bash-Handbuch lese, kann ich den Operator = ~ verwenden

Wenn ich mir das folgende Beispiel anschaue, würde ich erwarten, dass "nicht OK" angezeigt wird, aber ich sehe "OK". Was mache ich falsch?

i="test"
if [ $i=~"200[78]" ]
then
  echo "OK"
else
  echo "not OK"
fi
idrosid
quelle
mögliches Duplikat von Bash Regex mit Anführungszeichen?
Outis
Beachten Sie, dass dies aufgrund des Platzmangels fehlschlug =~.
Fedorqui 'SO hör auf,'

Antworten:

116

Es wurde zwischen 3.1 und 3.2 geändert:

Dies ist eine knappe Beschreibung der neuen Funktionen, die seit der Veröffentlichung von bash-3.1 zu bash-3.2 hinzugefügt wurden.

Das Zitieren des Zeichenfolgenarguments für den Operator [[Befehl = ~] erzwingt jetzt den Zeichenfolgenabgleich wie bei den anderen Operatoren für den Mustervergleich.

Verwenden Sie es also ohne die Anführungszeichen wie folgt:

i="test"
if [[ $i =~ 200[78] ]] ; then
    echo "OK"
else
    echo "not OK"
fi
paxdiablo
quelle
1
Wie gehe ich mit der Situation um, in der der reguläre Ausdruck Leerzeichen enthält, wenn ich nicht zitieren kann? Wenn die Regex zB ist a +b, wird ein Syntaxfehler
gemeldet
5
@Alderath: Verwenden Sie diese Option a\ \+b, um dem Leerzeichen und dem Pluszeichen zu entkommen.
blinry
8

Sie benötigen Leerzeichen um den Operator = ~

i = "Test"
if [[$ i = ~ "200 [78]"]];
dann
  Echo "OK"
sonst
  Echo "nicht OK"
fi
michiel
quelle
3
Die Antwort von paxdiablo ist richtig, das Hinzufügen von Leerzeichen hier hilft nicht (Sie erhalten jetzt auch "nicht OK" für 2008, die einzige Zeichenfolge, die übereinstimmt, ist buchstäblich "200 [78]").
Marcel Stimberg