Скрипт оболочки — проверка того, является ли введенный символ заглавным, строчным или специальным символом

Скрипт оболочки — проверка того, является ли введенный символ заглавным, строчным или специальным символом

Это мой код, который я написал. Мне нужен простой код, использующий 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

Связанный контент