Używając GNU bash (wersja 4.0.35 (1) -release (x86_64-suse-linux-gnu), chciałbym zanegować test za pomocą wyrażeń regularnych. Na przykład chciałbym warunkowo dodać ścieżkę do zmiennej PATH, jeśli ścieżki już tam nie ma, jak w:
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
Jestem pewien, że istnieje milion sposobów, aby to zrobić, ale chciałbym wiedzieć, czy warunek można w jakiś sposób zanegować, tak jak w (błędnym):
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
źródło
źródło
Możesz również umieścić wykrzyknik w nawiasach:
ale powinieneś zakotwiczyć swój wzorzec, aby zredukować fałszywe alarmy:
który szuka dopasowania na początku lub na końcu dwukropkiem przed lub po nim (lub oba). Zalecam używanie nazw zmiennych pisanych małymi lub mieszanymi literami jako nawyku, aby zmniejszyć ryzyko kolizji nazw ze zmiennymi powłoki.
źródło
$
więc nie ma powodu, aby je pisać wielkimi literami, aby się wyróżniały.if [[ ! $foo =~ bar ]]
bezpieczniejsze niżif ! [[ $foo =~ bar ]]
, ponieważ ułatwia to wprowadzenie większej liczby warunków doif
najbezpieczniej jest umieścić! dla negacji wyrażenia regularnego w ramach
[[ ]]
tego:w przeciwnym razie może się nie powieść w niektórych systemach.
źródło
Tak, możesz zanegować test jako SiegeX już wskazał .
Nie powinieneś jednak używać do tego wyrażeń regularnych - może się to nie powieść, jeśli twoja ścieżka zawiera znaki specjalne. Spróbuj tego zamiast tego:
(Źródło)
źródło
Lubię upraszczać kod bez używania operatorów warunkowych w takich przypadkach:
źródło