O problema é que o intervalo de caracteres [a-z]
inclui as letras maiúsculas. Isso é explicado no manual do bash :
Dentro de uma expressão de colchetes, uma expressão de intervalo consiste em dois caracteres separados por um hífen. Ele corresponde a qualquer caractere único que classifica entre os dois caracteres, inclusive. Na localidade C padrão, a sequência de classificação é a ordem dos caracteres nativos; por exemplo, "[a-d]" é equivalente a "[abcd]". Em outras localidades, a seqüência de classificação não é especificada e '[ad]' pode ser equivalente a '[abcd]' ou a '[aBbCcDd]' , ou pode não corresponder a nenhum caractere ou ao conjunto de caracteres que corresponde pode até ser errático. Para obter a interpretação tradicional de expressões de colchetes, você pode usar o código de idioma "C" definindo a variável de ambiente LC_ALL como o valor "C".
Para ilustrar:
$ case B in [a-c]) echo YES;; *) echo NO;; esac
YES
$ LC_ALL=C; case B in [a-c]) echo YES;; *) echo NO;; esac
NO
Então, o que acontece é que na sua localidade (que não é C
), [a-c]
é realmente [aAbBcC]
. É por isso que você deve usar as classes de caracteres POSIX como sugerido por @karel.