Este es mi código que he escrito. Necesito un código simple usando if elif para verificar si el carácter leído es mayúscula, minúscula o un símbolo especial.
echo "enter a char"
read c
if [[ $c == [A-Z] ]];
then
echo "upper"
elif [[ $c == [a-z] ]];
then
echo "lower"
else
echo "Digit or special symbols!"
fi
El siguiente es el resultado que recibí después de ingresar caracteres.
enter a char
A
upper
enter a char
a
Digit or special symbols!
aravind@bionic-beaver:~/Desktop$ ./1.sh
enter a char
1
Digit or special symbols!
Respuesta1
A menos que vacíe $IFS
y agregue la -r
opción,read
lee una línea de entrada de una manera muy especial.
Por ejemplo, si el usuario ingresa " \x "
, con el valor predeterminado de $IFS
, $c
contendrá x
, no lo que el usuario ingresó.
Tampoco [a-z]
coincide con letras minúsculas, coincide con cualquier tipo entre a
y z
en la configuración regional (con alguna variación en el comportamiento entre shell. Por ejemplo, con bash
, en muchas configuraciones regionales, eso incluye las letras en inglés entre A e Y). Incluso podría hacer coincidir secuencias de caracteres en algunas ubicaciones y algunas herramientas.
Aquí probablemente querrás:
printf >&2 'Please enter a character: '
IFS= read -r c
case $c in
([[:lower:]]) echo lowercase letter;;
([[:upper:]]) echo uppercase letter;;
([[:alpha:]]) echo neither lower nor uppercase letter;;
([[:digit:]]) echo decimal digit;;
(?) echo any other single character;;
("") echo nothing;;
(*) echo anything else;;
esac
(esa sintaxis es POSIX sh
, ni siquiera es necesario instalarla bash
).
Si desea limitarlo a las letras en inglés (letras de la escritura latina sin signos diacríticos), deberá nombrarlas individualmente:
([abcdefghijklmnopqrstuvwxyz]) echo English lowercase letter;;
O arregle la configuración regional en C export LC_ALL=C
después read
y antes de la case
declaración, pero entonces la (?)
prueba no sería válida ya que podría interpretar incorrectamente algún carácter como una secuencia de caracteres. Por ejemplo, un UTF-8 é
se vería como dos caracteres en la configuración regional C.
Respuesta2
Intente utilizar pruebas de expresiones regulares:
read -p "Type a character" c
if [[ "$c" =~ [a-z] ]]; then
echo "lowercase"
elif [[ "$c" =~ [A-Z] ]]; then
echo "uppercase"
else
echo "Non-alphabetic"
fi
Respuesta3
asegúrese de incluir las variables entre comillas; si está probando una expresión regular como una cadena, por ejemplo, puede ingresar lo siguiente:
echo "enter a US state name"
read var_1
if [[ "$var_1" =~ [A-Z] ]]; then
echo "contains a capital letter"
elif [[ "$var_1" =~ [a-z] ]]; then
echo "contains lower case letters"
else
echo "contains special characters or numbers"
fi
Respuesta4
while read -r line; do
[[ "${line:0:1}" =~ [[:upper:]] ]] && echo "Started with upper: $line" || echo "$line";
done</path/to/file