Shell-Skript - Überprüfen Sie, ob eine einzelne Zeicheneingabe Groß- oder Kleinbuchstaben oder Sonderzeichen enthält

Shell-Skript - Überprüfen Sie, ob eine einzelne Zeicheneingabe Groß- oder Kleinbuchstaben oder Sonderzeichen enthält

Dies ist der Code, den ich geschrieben habe. Ich brauche einen einfachen Code, der if elif verwendet, um zu prüfen, ob das gelesene Zeichen ein Großbuchstabe, ein Kleinbuchstabe oder ein Sonderzeichen ist.

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

Das Folgende ist die Ausgabe, die ich nach der Eingabe von Zeichen erhalten habe

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!

Antwort1

Sofern Sie die Option nicht leeren $IFSund hinzufügen ,-rreadliest eine Eingabezeile auf eine ganz besondere Art und Weise.

Wenn der Benutzer beispielsweise " \x "mit dem Standardwert eingibt $IFS, $centhält x, nicht das, was der Benutzer eingegeben hat.

[a-z]Kleinbuchstaben werden ebenfalls nicht abgeglichen, alles, was zwischen aund zim Gebietsschema sortiert wird (mit einigen Abweichungen im Verhalten zwischen den Shells. Beispielsweise bashschließt dies mit in vielen Gebietsschemas die englischen Buchstaben zwischen A und Y ein). In einigen Gebietsschemas und einigen Tools können sogar Zeichenfolgen abgeglichen werden.

Hier möchten Sie wahrscheinlich:

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

(Da es sich bei dieser Syntax um eine POSIX- shSyntax handelt, müssen Sie sie nicht einmal installieren bash.)

Wenn Sie es auf die englischen Buchstaben (Buchstaben der lateinischen Schrift ohne diakritische Zeichen) beschränken möchten, müssen Sie sie entweder einzeln benennen:

([abcdefghijklmnopqrstuvwxyz]) echo English lowercase letter;;

Oder legen Sie das Gebietsschema mit export LC_ALL=Cnach readund vor der caseAnweisung auf C fest. Dann (?)wäre der Test jedoch ungültig, da er einige Zeichen fälschlicherweise als Zeichenfolge interpretieren könnte. Beispielsweise éwürde ein UTF-8 im Gebietsschema C als zwei Zeichen angesehen.

Antwort2

Versuchen Sie es mit Tests mit regulären Ausdrücken:

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

Antwort3

Achten Sie darauf, die Variablen in Anführungszeichen zu setzen. Wenn Sie beispielsweise einen regulären Ausdruck als Zeichenfolge testen, können Sie Folgendes eingeben:

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
    

Antwort4

while read -r line; do
    [[ "${line:0:1}" =~ [[:upper:]] ]] && echo "Started with upper: $line" || echo "$line";
done</path/to/file

verwandte Informationen