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 $IFS
e adicione a -r
opção,read
lê uma linha de entrada de uma maneira muito especial.
Por exemplo, se o usuário inserir " \x "
, com o valor padrão $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 tipo entre a
e z
na 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=C
após read
e antes da case
instruçã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