Search code examples
bashshellunary-operatoroperands

How to use the =~ operand?


I've bumped into a Nagios check script which has been written by someone who already left my company and there's an operator there which I can't understand it's use. This is the relevant part from the shell script:

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

My question is:

What is this =~?

I've checked about it in the internet and found that it's a bitwise which "Flips the bits in the operand", but I don't understand where and how to use it, can you please elaborate?

Edit #1: This is the full script:

#!/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

My question is, couldn't the coder use this (without the ~) instead?

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

Edit #2: Here are some examples I tried:

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

Edit #3: Okay, I've done some more tests and I believe I understand it now:

$ [[ "$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
$

Thank you all for your help and information!


Solution

  • It is used to perform comparisons in strings.

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

    Checks if $URL contains the content of the variable $ACTIVE and if $URL2 contains the content of the variable $ACTIVE2.

    See a test:

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

    In the last one you have to indicate the regex properly. It is equivalent to using == and just *ll*.

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

    From man bash -> 3.2.4.2 Conditional Constructs:

    An additional binary operator, =~, is available, with the same precedence as == and !=. When it is used, the string to the right of the operator is considered an extended regular expression and matched accordingly (as in regex(3)). The return value is 0 if the string matches the pattern, and 1 otherwise. If the regular expression is syntactically incorrect, the conditional expression's return value is 2.