Рассмотрим этот скрипт 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
Если я введу «а», то получится строчная буква , и то же самое для «А» ... Как мне преодолеть это?
echo if case then do
.Ответы:
Для получения дополнительной информации о регулярном выражении строчных букв [az] и регулярном выражении верхних регистров [AZ] в bash см. Почему оператор регистра не чувствителен к регистру, когда nocasematch выключен? ,
источник
[0-9]
вас можно использовать[[:digit:]]
. Вы можете найти больше примеров в классах символовman grep
Google или posix .Проблема в том, что диапазон символов на
[a-z]
самом деле включает буквы верхнего регистра. Это объясняется в руководстве по bash :Проиллюстрировать:
Итак, что происходит, так это то, что в вашей локали (а это не так
C
) на[a-c]
самом деле[aAbBcC]
. Вот почему вы должны использовать классы символов POSIX, как предложено @karel.источник
LC_COLLATE
наC
, это нормально, если другие настройки локали будут другими. УстановкаLC_COLLATE
на что угодно, ноC
редко бывает хорошей идеей, но, к сожалению, Ubuntu делает это (это далеко не единственный виновник).