Как использовать операнд =~?

Я наткнулся на скрипт проверки Nagios, который был написан кем-то, кто уже покинул мою компанию, и там есть оператор, использование которого я не понимаю. Это соответствующая часть сценария оболочки:

if [[ "$URL" =~ $ACTIVE ]] &&  [[ "$URL2" =~ $ACTIVE2 ]]; then
        echo "OK: $HOST is ACTIVE in the Load Balancer"
        exit 0

Мой вопрос:

Что это =~?

Я проверил это в Интернете и обнаружил, что это побитовое значение, которое «переворачивает биты в операнде», но я не понимаю, где и как это использовать, не могли бы вы уточнить?

Изменить № 1: это полный скрипт:

#!/bin/bash 

#Purpose: Checks if proxy is active in the LB
#Date: May 09, 2011

#Variables
HOST=$1
URL=`wget --timeout=60 -w 3 -qO- http://$HOST:8080/proxy/keepalive?file=/workspace/temp/1`
URL2=`wget --timeout=60 -w 3 -qO- http://$HOST:8080/proxy/keepalive?file=/workspace/temp/1.txt`
ACTIVE="1"
ACTIVE2="ppp"
LOG="/tmp/PROXY-LB.log"


#Begin Code

if [ -z $HOST ]; then
        echo "You must specify IPADDRESS (e.g. 68.67.174.34)"
        exit 3
fi

if [[ "$URL" =~ $ACTIVE ]] &&  [[ "$URL2" =~ $ACTIVE2 ]]; then
        echo "OK: $HOST is ACTIVE in the Load Balancer"
        exit 0

else
        echo "*** Problem: $HOST is out from the Load Balancer" 
        echo "`date`: *** HOST $HOST is out from the Load Balancer" >> $LOG 2>&1
        exit 2

fi

#END

Мой вопрос: не мог ли кодер использовать это (без ~) вместо этого?

if [[ "$URL" = $ACTIVE ]] &&  [[ "$URL2" = $ACTIVE2 ]]; then

Редактировать № 2: Вот несколько примеров, которые я пробовал:

$ d="hello"
$ [[ "$d" =~ *ll* ]] && echo "yes"
$ [[ "$d" =~ he* ]] && echo "yes"
yes
$ [[ "$d" =~ *lo ]] && echo "yes"
$ 

Редактировать № 3: Хорошо, я провел еще несколько тестов и, кажется, теперь понял:

$ [[ "$d" =~ he* ]] && echo "yes"
yes
$ [[ "$d" =~ *lo ]] && echo "yes"
$ [[ "$d" =~ h* ]] && echo "yes"
yes
$ [[ "$d" =~ lo$ ]] && echo "yes"
yes
$ [[ "$d" =~ ^he ]] && echo "yes"
yes
$ [[ "$d" =~ [a-z]ll[a-z] ]] && echo "yes"
yes
$

Всем спасибо за помощь и информацию!


person Itai Ganot    schedule 01.10.2014    source источник
comment
Может быть, это ваше решение? stackoverflow.com/questions/19441521/bash-regex-operator   -  person cslotty    schedule 01.10.2014
comment
Мне просто сложно понять, почему именно в этом скрипте это использовалось... и спасибо, информация в этой теме тоже интересна.   -  person Itai Ganot    schedule 01.10.2014


Ответы (1)


Он используется для выполнения сравнений в строках.

if [[ "$URL" =~ $ACTIVE ]] &&  [[ "$URL2" =~ $ACTIVE2 ]]; then

Проверяет, содержит ли $URL содержимое переменной $ACTIVE и содержит ли $URL2 содержимое переменной $ACTIVE2.

Смотрите тест:

$ d="hello"
$ [[ "$d" =~ he* ]] && echo "yes"
yes
$ [[ "$d" =~ *ba* ]] && echo "yes"
$
$ [[ $d =~ .*ll.* ]] && echo "yes"
yes

В последнем вы должны правильно указать регулярное выражение. Это эквивалентно использованию == и просто *ll*.

$ [[ $d == *ll* ]] && echo "yes"
yes

From man bash -> 3.2.4.2 Условные конструкции:

Доступен дополнительный бинарный оператор =~ с таким же приоритетом, как == и !=. Когда он используется, строка справа от оператора считается расширенным регулярным выражением и сопоставляется соответствующим образом (как в регулярном выражении (3)). Возвращаемое значение равно 0, если строка соответствует шаблону, и 1 в противном случае. Если регулярное выражение синтаксически неверно, возвращаемое значение условного выражения равно 2.

person fedorqui 'SO stop harming'    schedule 01.10.2014
comment
Смотрите мое обновление для вашего редактирования № 2. Изучу редактирование №1 позже. - person fedorqui 'SO stop harming'; 01.10.2014