Shell Script: compruebe si la entrada de un solo carácter es mayúscula, minúscula o carácter especial

Shell Script: compruebe si la entrada de un solo carácter es mayúscula, minúscula o carácter especial

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 $IFSy agregue la -ropción,readlee una línea de entrada de una manera muy especial.

Por ejemplo, si el usuario ingresa " \x ", con el valor predeterminado de $IFS, $ccontendrá x, no lo que el usuario ingresó.

Tampoco [a-z]coincide con letras minúsculas, coincide con cualquier tipo entre ay zen 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=Cdespués ready antes de la casedeclaració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

información relacionada