Thanks to Mad Sweeney and Stuart Little for commenting on this issue.

In the light of your comments my simple tests were these:

$ [[ 'axb' =~ a.b ]] &amp;&amp; echo "Match"
Match
- The RE on the right uses '.' as a metacharacter

$ [[ 'axb' =~ a'.'b ]] &amp;&amp; echo "Match"
- The "meta-ness" of the '.' is removed by quoting, so no match

$ [[ 'a.b' =~ a'.'b ]] &amp;&amp; echo "Match"
Match
- Proving that a literal match works

$ re="a'.'b"
$ [[ 'a.b' =~ $re ]] &amp;&amp; echo "Match"
- Now the match fails if the RE is in a variable

$ eval "[[ 'a.b' =~ $re ]] &amp;&amp; echo Match"
Match
- Following Mad Sweeney's lead, the 'eval' substitutes in the contents of '$re' so it looks to the extended test like the literal string we used earlier, and thus it works.

My working hypothesis is that the Bash logic processing this can deal with quoted metacharacters in a "bare string" but isn't used when the RE is in a variable - or maybe in any case where expansion is needed to provide the RHS argument.

You'd have to think this was a bug I guess.