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 $IFS
und hinzufügen ,-r
read
liest eine Eingabezeile auf eine ganz besondere Art und Weise.
Wenn der Benutzer beispielsweise " \x "
mit dem Standardwert eingibt $IFS
, $c
enthält x
, nicht das, was der Benutzer eingegeben hat.
[a-z]
Kleinbuchstaben werden ebenfalls nicht abgeglichen, alles, was zwischen a
und z
im Gebietsschema sortiert wird (mit einigen Abweichungen im Verhalten zwischen den Shells. Beispielsweise bash
schließ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- sh
Syntax 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=C
nach read
und vor der case
Anweisung 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