shell: O operador = ~ não funciona como esperado

2

Considere o seguinte script:

#! /bin/bash

line="confusing"

if [[ $line =~ [[:lower:]]* ]]
then
    echo "matches!"
else
    echo "does not match."
fi

Embora o acima produza o resultado esperado, o seguinte não:

#! /bin/bash

line="CoNfUsInG"

if [[ $line =~ [[:lower:]]* ]]
then
    echo "matches!"
else
    echo "does not match."
fi

Isto imprime "correspondências!"
Estou confuso; não é a expressão regular [[:lower:]]* significa zero ou mais letras minúsculas?

Fica ainda mais confuso quando o seguinte também imprime "correspondências"

#! /bin/bash

line="CoNfUsInG"

if [[ $line =~ [[:digit:]]* ]]
then
    echo "matches!"
else
    echo "does not match."
fi

Alguém tem uma explicação de por que isso acontece?

    
por so.very.tired 13.11.2015 / 17:47

1 resposta

10

A expressão regular não precisa corresponder à string inteira. É por isso que você tem ^ e $ para o início e o fim da sequência, respectivamente.

[[ CoNfUsInG =~ ^[[:lower:]]*$ ]] || echo no

CoNFUsInGlY, ^[[:lower:]]* (sem o $ ) ainda corresponde, pois há zero letras minúsculas no início da string.

    
por 13.11.2015 / 17:49