Xentrees
Xentrees

Reputation: 43

How to match regular expressions with an if statement

I am trying to perform a simple comparison within an if statement

basically it is taking the input from a user and then checking to verify that it is a proper entry.

This specific script is checking serial numbers.

read -p "enter in you serial number:  serial_number
if [[ $serial_number == FOO[A-Z0-9]{3}-[A-Z0-9]{4} ]]
    then echo -e "validation passed"
    else echo -e "validation failed"
fi 

However if I enter FOO123-ABCD, I get validation failed.

The only way I have been able to get it to work is much uglier

if $serial_number == [A-Z0-9][A-Z0-9][A-Z0-9][A-Z0-9][A-Z0-9][A-Z0-9]-[A-Z0-9][A-Z0-9][A-Z0-9][A-Z0-9] ]]

Is there something I am doing wrong with the curly braces or is there some switch I have to use in order to compare extended expressions?

So far I have tried:

[[ "$serial_number" == FOO[A-Z0-9]{3}-[A-Z0-9]{4} ]]    
[[ "$serial_number" == "FOO[A-Z0-9]{3}-[A-Z0-9]{4}" ]]  
[[ "${serial_number}" == FOO[A-Z0-9]{3}-[A-Z0-9]{4} ]]     
[[ "${serial_number}" == "FOO[A-Z0-9]{3}-[A-Z0-9]{4}" ]]         
[[ "$serial_number" =~ FOO[A-Z0-9]{3}-[A-Z0-9]{4} ]]       
[[ "$serial_number" =~ "FOO[A-Z0-9]{3}-[A-Z0-9]{4}" ]]         
[[ "${serial_number}" =~ FOO[A-Z0-9]{3}-[A-Z0-9]{4} ]]      
[[ "${serial_number}" =~ "FOO[A-Z0-9]{3}-[A-Z0-9]{4}" ]]

Upvotes: 1

Views: 66

Answers (1)

Gene
Gene

Reputation: 47020

This is working fine for me:

read -p "enter in you serial number:" serial_number
echo ">>$serial_number<<"
if [[ "$serial_number" =~ ^FOO[A-Z0-9]{3}-[A-Z0-9]{4}$ ]]; then
  echo -e "validation passed"
else
  echo -e "validation failed"
fi

Note you need the ^ and $. Else it's checking for an occurrence anywhere in the string (like egrep).

Upvotes: 3

Related Questions