O problema é que o intervalo de caracteres [a-z]na verdade inclui as letras maiúsculas. Isso é explicado no manual do bash :
Dentro de uma expressão entre colchetes, uma expressão de intervalo consiste em dois caracteres separados por um hífen. Corresponde a qualquer caractere único que classifique entre os dois caracteres, inclusive. No código de idioma C padrão, a sequência de classificação é a ordem de caracteres nativa; por exemplo, '[ad]' é equivalente a '[abcd]'. Em outros locais, a sequência de classificação não é especificada e '[ad]' pode ser equivalente a '[abcd]' ou '[aBbCcDd]' ou pode falhar em corresponder a qualquer caractere ou ao conjunto de caracteres que ele contém. as correspondências podem até ser erráticas. Para obter a interpretação tradicional das expressões entre colchetes, você pode usar o código do idioma 'C' configurando a variável de ambiente LC_ALL para o valor 'C'.
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 (o que não é C), [a-c]é realmente [aAbBcC]. É por isso que você deve usar as classes de caracteres POSIX, como sugerido por @karel.