Это мой код, который я написал. Мне нужен простой код, использующий if elif для проверки того, является ли считанный символ заглавной буквой, строчной буквой или специальным символом.
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
Ниже приведен вывод, который я получил после ввода символов.
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!
решение1
Если вы не очистите $IFS
и не добавите -r
опцию,read
считывает строку ввода совершенно особым образом.
Например, если пользователь вводит " \x "
, при значении по умолчанию $IFS
, $c
будет содержать x
, а не то, что ввел пользователь.
Также [a-z]
не соответствует строчным буквам, соответствует всем сортировкам между a
и z
в локали (с некоторыми различиями в поведении между оболочкой. Например, с bash
, во многих локалях, которые включают английские буквы между A и Y). Он может даже соответствовать последовательностям символов в некоторых локалях и некоторых инструментах.
Здесь вам, вероятно, понадобится:
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
(этот синтаксис является sh
синтаксисом POSIX, вам даже не нужно устанавливать bash
).
Если вы хотите ограничиться английскими буквами (буквами латинского алфавита без диакритических знаков), вам нужно будет либо назвать их по отдельности:
([abcdefghijklmnopqrstuvwxyz]) echo English lowercase letter;;
Или исправьте локаль на C с помощью export LC_ALL=C
после read
и перед case
оператором, но тогда (?)
тест будет недействительным, поскольку он может неправильно интерпретировать некоторые символы как последовательность символов. Например, UTF-8 é
будет рассматриваться как два символа в локали C.
решение2
Попробуйте использовать тесты с регулярными выражениями:
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
решение3
обязательно заключите переменные в кавычки — например, если вы тестируете регулярное выражение как строку, вы можете ввести следующее:
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
решение4
while read -r line; do
[[ "${line:0:1}" =~ [[:upper:]] ]] && echo "Started with upper: $line" || echo "$line";
done</path/to/file