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

1

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

O seguinte é 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!
    
por FortuneCookie 27.11.2017 / 20:04

2 respostas

0

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
    
por 27.11.2017 / 20:12
4

A menos que você esvazie $IFS e adicione a opção -r , read lê uma linha de entrada de uma maneira muito especial .

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

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

Aqui, você provavelmente desejaria:

printf '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 sendo POSIX sh syntax, você nem precisa instalar bash ).

Se você quisesse limitá-lo às letras em inglês (letras do alfabeto latino sem diacríticos), seria necessário nomeá-las individualmente:

([abcdefghijklmnopqrstuvwxyz]) echo English lowercase letter;;

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

    
por 27.11.2017 / 20:30