Как отменить тест с помощью регулярных выражений в скрипте bash? - PullRequest
139 голосов
/ 28 декабря 2010

Используя GNU bash (версия 4.0.35 (1) -релиз (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

Ответы [ 5 ]

148 голосов
/ 28 декабря 2010

Вы правильно поняли, просто поставьте пробел между ! и [[, как if ! [[

105 голосов
/ 28 декабря 2010

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

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

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

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

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

17 голосов
/ 21 октября 2011

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

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

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

7 голосов
/ 28 декабря 2010

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

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

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

(Источник)

4 голосов
/ 04 октября 2017

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

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