Как отменить тест с регулярными выражениями в bash script?

Использование GNU bash (версия 4.0.35 (1) -release (x86_64-suse-linux-gnu), я хотел бы отменить тест с помощью регулярных выражений. Например, я хотел бы условно добавить путь к переменной PATH, если путь еще не существует, как в:

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

Я уверен, что есть миллион способов сделать это, но то, что я хотел бы знать, - это то, что условное можно каким-то образом отменить, как в (ошибочном):

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

Спасибо!

Ответ 1

У вас все получилось, просто поставьте пробел между ! и [[ как if ! [[

Ответ 2

Вы также можете поместить восклицательный знак в скобки:

if [[ ! $PATH =~ $temp ]]

но вы должны привязать свой шаблон для уменьшения ложных срабатываний:

temp=/mnt/silo/bin
pattern="(^|:)$temp(:|$)"
if [[ ! $PATH =~ $pattern ]]

который ищет совпадение в начале или конце с двоеточием до или после него (или и тем и другим). Я рекомендую использовать строчные или смешанные имена переменных в качестве привычки, чтобы уменьшить вероятность столкновений имен с переменными оболочки.

Ответ 3

Самый безопасный способ - поставить! для отрицания регулярного выражения в [[ ]] следующим образом:

if [[ ! ${STR} =~ YOUR_REGEX ]]; then

в противном случае он может выйти из строя в определенных системах.

Ответ 4

Да, вы можете отменить тест, поскольку SiegeX уже указал.

Однако вы не должны использовать для этого регулярные выражения - он может выйти из строя, если ваш путь содержит специальные символы. Вместо этого попробуйте:

[[ ":$PATH:" != *":$1:"* ]]

(Источник)

Ответ 5

Мне нравится упрощать код без использования условных операторов в таких случаях:

TEMP=/mnt/silo/bin
[[ ${PATH} =~ ${TEMP} ]] || PATH=$PATH:$TEMP