Как проверить вводимое пользователем значение - верхний регистр, нижний регистр или цифра с помощью Shell Script? - PullRequest
2 голосов
/ 07 ноября 2019

Я пытаюсь записать shell script, чтобы прочитать введенные пользователем данные и проверить, является ли введенное значение либо Прописные буквы, Строчные буквы или что-либо еще . Но то, что я написал, это только проверка одного символа

Вот что я написал:

printf '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

Как я могу заставить его читать длинную строку другойчем один символ и получить вывод соответственно?

Ответы [ 2 ]

1 голос
/ 07 ноября 2019

Предшествуя вашему использованию с shopt -s extglob, вы можете использовать +([[:upper:]]) для сопоставления строки, состоящей из одной или нескольких заглавных букв.

С man 1 bash:

       If the extglob shell option is enabled using the shopt builtin, several
       extended  pattern  matching operators are recognized.  In the following
       description, a pattern-list is a list of one or more patterns separated
       by a |.  Composite patterns may be formed using one or more of the fol‐
       lowing sub-patterns:

              ?(pattern-list)
                     Matches zero or one occurrence of the given patterns
              *(pattern-list)
                     Matches zero or more occurrences of the given patterns
              +(pattern-list)
                     Matches one or more occurrences of the given patterns
              @(pattern-list)
                     Matches one of the given patterns
              !(pattern-list)
                     Matches anything except one of the given patterns

Использованиенапример, +([[:upper:][:digit:] .]) для соответствия одной или нескольким {заглавным буквам, цифрам, пробелам, точкам}. Рассмотрите возможность использования некоторых других следующих классов, определенных в стандарте POSIX:
alnum alpha ascii blank cntrl digit graph lower print punctspace upper word xdigit

Доказательство (просто тест на примере), что оно работает:

shopt -s extglob; case "1A5. .Q7." in (+([[:upper:][:digit:] .])) echo "it works";; esac
1 голос
/ 07 ноября 2019

Вы можете сделать это разными способами, здесь у вас есть один:

#!/bin/bash

read -p "Enter something: "  str
echo "Your input is: $str"

strUppercase=$(printf '%s\n' "$str" | awk '{ print toupper($0) }')
strLowercase=$(printf '%s\n' "$str" | awk '{ print tolower($0) }')

if [ -z "${str//[0-9]}" ]
then
    echo "Digit"
elif [ $str == $strLowercase ]
then
    echo "Lowercase"
elif [ $str == $strUppercase ]
then
    echo "Uppercase"
else
    echo "Something else"
fi
...