(3 Antworten)
Vor 3 Jahren geschlossen.
Warum funktioniert also Folgendes, dh druckt die Übereinstimmung aus:
THE_REGEX='^test\/version[0-9]+([.][0-9]+)+$'
if [[ "$SOME_VAR" =~ $THE_REGEX ]]; then
echo "Match!"
fi
Folgendes jedoch NICHT:
if [[ "$SOME_VAR" =~ '^test\/version[0-9]+([.][0-9]+)+$' ]]; then
echo "Match!"
fi
Was ist der Unterschied? Es ist dieselbe Regex
Akzeptierte Antwort:
Verwenden Sie keine einfachen Anführungszeichen innerhalb von [[
:
if [[ "$SOME_VAR" =~ ^test\/version[0-9]+([.][0-9]+)+$ ]]; then
echo "Match!"
fi
Aus dem GNU-Bash-Handbuch:https://www.gnu.org/software/bash/manual/html_node/Conditional-Constructs.html#Conditional-Constructs
Beachten Sie insbesondere:
Jeder Teil des Musters kann in Anführungszeichen gesetzt werden, um zu erzwingen, dass der in Anführungszeichen gesetzte Teil als Zeichenfolge abgeglichen wird .
Das Handbuch scheint vorzuschlagen, dass die Variable bevorzugt wird:
Das Speichern des regulären Ausdrucks in einer Shell-Variablen ist oft eine nützliche Methode, um Probleme mit Shell-spezifischen Zeichen in Anführungszeichen zu vermeiden. Es ist manchmal schwierig, einen regulären Ausdruck buchstäblich ohne Anführungszeichen anzugeben oder die von regulären Ausdrücken verwendeten Anführungszeichen im Auge zu behalten und gleichzeitig auf das Entfernen von Anführungszeichen in der Shell zu achten. Die Verwendung einer Shell-Variablen zum Speichern des Musters verringert diese Probleme.