Considere este script Bash:
#!/bin/bash
echo Enter any character
read char
case $char in
[a-z]) echo Lower case letter
;;
[A-Z]) echo Upper case letter
;;
[0-9]) echo Number
;;
?) echo Special char
;;
*) echo You entered more than one character
;;
esac
Si ingreso 'a', la salida es minúscula y es igual para 'A' ... ¿Cómo puedo superar esto?
echo if case then do
.Respuestas:
Para obtener más información acerca de la expresión regular en minúsculas de [az] y la expresión regular en mayúsculas de [AZ] en bash, consulte ¿Por qué no se distingue entre mayúsculas y minúsculas cuando nocasematch está desactivado? .
fuente
[0-9]
que pueda usar[[:digit:]]
. Puede encontrar más ejemplos en las clases de caracteres posix deman grep
Google .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 :Para ilustrar:
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.fuente
LC_COLLATE
aC
, está bien que los otros valores de localización para ser diferente. EstablecerLC_COLLATE
cualquier cosa, peroC
rara vez es una buena idea, pero lamentablemente Ubuntu lo hace (no es el único culpable por el momento).