É porque você tem aspas duplas em torno de $REGEX
. Ao combinar com o operador =~
, as seções citadas do padrão são tratadas literalmente. Ou seja, os metacaracteres de expressão regular nas seções citadas são tratados como se fossem escapados. Compare o efeito quando o padrão está entre aspas:
$ # Pattern in variable, quoted:
$ [[ $STR =~ "$REGEX" ]] && echo "True" || echo "False"
+ [[ string_with[6]indice =~ \[0-9] ]]
+ echo False
False
$ # Pattern directly in command, quoted:
$ [[ $STR =~ "[0-9]" ]] && echo "True" || echo "False"
+ [[ string_with[6]indice =~ \[0-9] ]]
+ echo False
False
com o efeito sem aspas:
$ # Pattern in variable, NOT quoted:
$ [[ $STR =~ $REGEX ]] && echo "True" || echo "False"
+ [[ string_with[6]indice =~ [0-9] ]]
+ echo True
True
$ # Pattern directly in command, NOT quoted:
$ [[ $STR =~ [0-9] ]] && echo "True" || echo "False"
+ [[ string_with[6]indice =~ [0-9] ]]
+ echo True
True
Este é um dos poucos casos em que você não quer citar uma referência de variável.
BTW, recomendo usar nomes de variáveis em minúsculas ou mistas em scripts de shell; Dessa forma, você não corre o risco de entrar em conflito com alguma variável de ambiente que tenha um significado especial para o shell ou outros programas ( $PATH
é o exemplo clássico).