El problema es que el rango de caracteres en [a-z]
realidad incluye las letras mayúsculas. Esto se explica en el manual de bash :
Dentro de una expresión de paréntesis, una expresión de rango consta de dos caracteres separados por un guión. Coincide con cualquier carácter individual que se clasifique entre los dos caracteres, inclusive. En la configuración regional C predeterminada, la secuencia de clasificación es el orden de los caracteres nativos; por ejemplo, '[ad]' es equivalente a '[abcd]'. En otras configuraciones regionales, la secuencia de clasificación no se especifica y '[ad]' podría ser equivalente a '[abcd]' o '[aBbCcDd]' , o podría no coincidir con ningún carácter o el conjunto de caracteres que los partidos pueden incluso ser erráticos. Para obtener la interpretación tradicional de las expresiones de paréntesis, puede usar la configuración regional 'C' estableciendo la variable de entorno LC_ALL en el 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
Entonces, lo que sucede es que en su configuración regional (que no lo es C
), [a-c]
es en realidad [aAbBcC]
. Es por eso que debería usar las clases de caracteres POSIX como lo sugiere @karel en su lugar.