Considere este script Bash:
#!/bin/bash
echo Enter any character
read char
case $char in
[a-z]) echo Lower case letter
;;
[A-Z]) echo Upper case letter
;;
[0-9]) echo Number
;;
?) echo Special char
;;
*) echo You entered more than one character
;;
esac
Se eu digitar 'a', a saída será minúscula e o mesmo será para 'A' ... Como supero isso?
echo if case then do
.Respostas:
Para obter mais informações sobre a expressão regular em minúscula de [az] e a expressão regular em maiúscula de [AZ] no bash, consulte Por que a declaração de caso não diferencia maiúsculas de minúsculas quando o nocasematch está desativado? .
fonte
[0-9]
você pode usar[[:digit:]]
. Você pode encontrar mais exemplosman grep
ou classes de caracteres do Google posix .O problema é que o intervalo de caracteres
[a-z]
na verdade inclui as letras maiúsculas. Isso é explicado no manual do bash :Ilustrar:
Então, o que acontece é que, na sua localidade (o que não é
C
),[a-c]
é realmente[aAbBcC]
. É por isso que você deve usar as classes de caracteres POSIX, como sugerido por @karel.fonte
LC_COLLATE
comoC
, não há problema em outras configurações de localidade serem diferentes. DefinirLC_COLLATE
qualquer coisa, masC
raramente é uma boa ideia, mas infelizmente o Ubuntu faz isso (não é o único culpado de longe).