GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Warum funktioniert die Regex in Bash nur, wenn es sich um eine Variable handelt und nicht direkt?

Für diese Frage gibt es hier bereits Antworten :Shell-Test, ob mehrzeilige Zeichenfolge in der letzten Zeile ein bestimmtes Muster enthält

(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.


Linux
  1. Warum funktioniert der reguläre Ausdruck in X, aber nicht in Y?

  2. Wie erhalte ich die eigene IP-Adresse und speichere sie in einer Variablen in einem Shell-Skript?

  3. Der Zweck von .bashrc und wie funktioniert es?

  4. Warum überprüft Bashrc, ob die aktuelle Shell interaktiv ist?

  5. Was bedeutet Env X=() { :;}; Command’ Bash Do und warum ist es unsicher?

Der Unterschied zwischen einem eingebauten Befehl und einem, der es nicht ist?

Warum stimmt [a-z] mit Kleinbuchstaben in Bash überein?

Rm-Befehl im Bash-Skript funktioniert nicht mit Variablen?

Der Musterabgleich funktioniert nicht im Bash-Skript

Warum fügt Strg + V nicht in Bash (Linux-Shell) ein?

Warum funktioniert diese Regex nicht unter Linux?