Por que o regex no bash funciona apenas se for uma variável e não diretamente? [duplicado]

1

Então, por que os seguintes trabalhos, ou seja, imprimem a correspondência:

THE_REGEX='^test\/version[0-9]+([.][0-9]+)+$'
if [[ "$SOME_VAR" =~ $THE_REGEX ]]; then
    echo "Match!"
fi

Mas o seguinte NÃO:

if [[ "$SOME_VAR" =~ '^test\/version[0-9]+([.][0-9]+)+$' ]]; then
    echo "Match!"
fi  

Qual é a diferença? É o mesmo regex

    
por Jim 16.03.2018 / 14:54

1 resposta

7

Não use as aspas simples dentro de [[ :

if [[ "$SOME_VAR" =~ ^test\/version[0-9]+([.][0-9]+)+$ ]]; then
    echo "Match!"
fi

No manual da GNU bash: link

Observe em particular:

Any part of the pattern may be quoted to force the quoted portion to be matched as a string.

O manual parece sugerir que usar a variável é preferível:

Storing the regular expression in a shell variable is often a useful way to avoid problems with quoting characters that are special to the shell. It is sometimes difficult to specify a regular expression literally without using quotes, or to keep track of the quoting used by regular expressions while paying attention to the shell’s quote removal. Using a shell variable to store the pattern decreases these problems.

Veja também Como o armazenamento da expressão regular em uma variável shell evita problemas com a citação de caracteres especiais para o shell?

    
por 16.03.2018 / 15:04