Rozważ ten skrypt 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
Jeśli wprowadzę „a”, wynik będzie pisany małą literą , i to samo dla „A” ... Jak to rozwiązać?
echo if case then do
.Odpowiedzi:
Aby uzyskać więcej informacji na temat wyrażeń regularnych małych liter [az] i wyrażeń regularnych dużych liter [AZ] w bash, zobacz Dlaczego rozróżnianie wielkości liter w rozróżnianiu małych i małych liter jest wyłączone? .
źródło
[0-9]
możesz użyć[[:digit:]]
. Możesz znaleźć więcej przykładówman grep
lub klas znaków posix Google .Problem polega na tym, że zakres znaków
[a-z]
zawiera duże litery. Jest to wyjaśnione w podręczniku bash :Ilustrować:
Tak więc dzieje się tak, że w twojej lokalizacji (która nie jest
C
),[a-c]
tak naprawdę jest[aAbBcC]
. Dlatego powinieneś używać klas znaków POSIX, jak sugeruje @karel.źródło
LC_COLLATE
naC
, że inne ustawienia regionalne mogą być inne. UstawienieLC_COLLATE
na cokolwiek, aleC
rzadko jest dobrym pomysłem, ale niestety Ubuntu to robi (to zdecydowanie nie jedyny winowajca).