views:

4293

answers:

4

I want to check if a variable has a valid year using a regular expression. Reading the bash manual I understand I could use the operator =~

Looking at the example below, I would expect to see "not OK" but I see "OK". What am I doing wrong?

i="test"
if [ $i=~"200[78]" ]
then
  echo "OK"
else
  echo "not OK"
fi
+1  A: 

This article uses double square brackets, and a semi-colon before the then. I'm pretty sure the latter is not needed when you have a line break, though. But try changing your brackets.

unwind
+7  A: 

It was changed between 3.1 and 3.2.

This is a terse description of the new features added to bash-3.2 since the release of bash-3.1.

Quoting the string argument to the [[ command's =~ operator now forces string matching, as with the other pattern-matching operators.

So use it without the quotes thus:

i="test"
if [[ $i =~ 200[78] ]] ; then
    echo "OK"
else
    echo "not OK"
fi
paxdiablo
You need spaces around the operator =~ (thanks Michiel)
Matthew Hegarty
A: 

Hi,

Could it be you need quotes around the $i ?

This example does that.

It also mentions Bash v3 - but I guess you are using that...

Chris Kimpton
+3  A: 

You need spaces around the operator =~

i="test"
if [[ $i =~ "200[78]" ]];
then
  echo "OK"
else
  echo "not OK"
fi
Michiel