Mit GNU bash (Version 4.0.35 (1) -release (x86_64-suse-linux-gnu) möchte ich einen Test mit regulären Ausdrücken negieren. Zum Beispiel möchte ich der PATH-Variablen bedingt einen Pfad hinzufügen. wenn der Pfad noch nicht vorhanden ist, wie in:
TEMP=/mnt/silo/bin
if [[ ${PATH} =~ ${TEMP} ]] ; then PATH=$PATH; else PATH=$PATH:$TEMP; fi
TEMP=/mnt/silo/Scripts:
if [[ ${PATH} =~ ${TEMP} ]] ; then PATH=$PATH; else PATH=$PATH:$TEMP; fi
TEMP=/mnt/silo/local/bin
if [[ ${PATH} =~ ${TEMP} ]] ; then PATH=$PATH; else PATH=$PATH:$TEMP; fi
export PATH
Ich bin mir sicher, dass es eine Million Möglichkeiten gibt, dies zu tun, aber ich würde gerne wissen, ob die Bedingung irgendwie negiert werden kann, wie in (dem Irrtum):
TEMP=/mnt/silo/bin
if ![[ ${PATH} =~ ${TEMP} ]] ; then PATH=$PATH:$TEMP; fi
TEMP=/mnt/silo/Scripts:
if ![[ ${PATH} =~ ${TEMP} ]] ; then PATH=$PATH:$TEMP; fi
TEMP=/mnt/silo/local/bin
if ![[ ${PATH} =~ ${TEMP} ]] ; then PATH=$PATH:$TEMP; fi
export PATH
regex
bash
conditional
negate
David Rogers
quelle
quelle
Sie können das Ausrufezeichen auch in die Klammern setzen:
Sie sollten Ihr Muster jedoch verankern, um Fehlalarme zu reduzieren:
die nach einer Übereinstimmung am Anfang oder Ende mit einem Doppelpunkt davor oder danach (oder beiden) sucht. Ich empfehle die Verwendung von Variablennamen in Klein- oder Großbuchstaben, um die Wahrscheinlichkeit von Namenskollisionen mit Shell-Variablen zu verringern.
quelle
$
sodass es keinen Grund gibt, sie in Großbuchstaben zu schreiben, um sie hervorzuheben.if [[ ! $foo =~ bar ]]
sicherer alsif ! [[ $foo =~ bar ]]
, weil es einfacher ist, mehr Bedingungen in dieif
der sicherste weg ist das zu setzen! für die Regex-Negation innerhalb der folgenden
[[ ]]
:Andernfalls kann es auf bestimmten Systemen fehlschlagen.
quelle
Ja, Sie können den Test negieren, wie SiegeX bereits betont hat.
Sie sollten hierfür jedoch keine regulären Ausdrücke verwenden. Dies kann fehlschlagen, wenn Ihr Pfad Sonderzeichen enthält. Versuchen Sie stattdessen Folgendes:
(Quelle)
quelle
In solchen Fällen möchte ich den Code vereinfachen, ohne bedingte Operatoren zu verwenden:
quelle