Shell Script - Verifique se uma entrada de caractere único é maiúscula ou minúscula ou caractere especial

Shell Script - Verifique se uma entrada de caractere único é maiúscula ou minúscula ou caractere especial

Este é o meu código que escrevi. Preciso de um código simples usando if elif para verificar se o caractere lido é maiúsculo, minúsculo ou um 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

A seguir está a saída que recebi após inserir 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!

Responder1

A menos que você esvazie $IFSe adicione a -ropção,readlê uma linha de entrada de uma maneira muito especial.

Por exemplo, se o usuário inserir " \x ", com o valor padrão $IFS, $cconterá x, não o que o usuário inseriu.

Também [a-z]não corresponde a letras minúsculas, corresponde a qualquer tipo entre ae zna localidade (com alguma variação no comportamento entre shell. Por exemplo, with bash, em muitas localidades, que inclui as letras em inglês entre A e Y). Pode até combinar sequências de caracteres em alguns locais e algumas ferramentas.

Aqui, você provavelmente iria querer:

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

(essa sintaxe é POSIX sh, você nem precisa instalar bash).

Se você quisesse limitá-lo às letras em inglês (letras da escrita latina sem diacríticos), você precisaria nomeá-las individualmente:

([abcdefghijklmnopqrstuvwxyz]) echo English lowercase letter;;

Ou corrija o código do idioma para C export LC_ALL=Capós reade antes da caseinstrução, mas o (?)teste seria inválido, pois poderia interpretar incorretamente algum caractere como uma sequência de caracteres. Por exemplo, um UTF-8 éseria visto como dois caracteres na localidade C.

Responder2

Tente usar testes de expressão regular:

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

Responder3

certifique-se de colocar as variáveis ​​entre aspas - se estiver testando uma expressão regular como uma string, por exemplo, você pode inserir o seguinte:

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
    

Responder4

while read -r line; do
    [[ "${line:0:1}" =~ [[:upper:]] ]] && echo "Started with upper: $line" || echo "$line";
done</path/to/file

informação relacionada