Betrachten Sie dieses Bash-Skript:
#!/bin/bash
echo Enter any character
read char
case $char in
[a-z]) echo Lower case letter
;;
[A-Z]) echo Upper case letter
;;
[0-9]) echo Number
;;
?) echo Special char
;;
*) echo You entered more than one character
;;
esac
Wenn ich 'a' eingebe, ist die Ausgabe ein Kleinbuchstabe und für 'A' dasselbe ... Wie überwinde ich das?
echo if case then do
.Antworten:
Weitere Informationen zum regulären Ausdruck von [az] in Kleinbuchstaben und zum regulären Ausdruck von [AZ] in Großbuchstaben in bash finden Sie unter Warum wird bei der Groß- / Kleinschreibung nicht zwischen Groß- und Kleinschreibung unterschieden, wenn nocasematch deaktiviert ist? .
quelle
[0-9]
verwenden[[:digit:]]
. Weitere Beispiele finden Sie inman grep
oder in Google Posix-Zeichenklassen .Das Problem ist, dass der Zeichenbereich
[a-z]
tatsächlich die Großbuchstaben enthält. Dies wird im Bash-Handbuch erklärt :Um zu veranschaulichen:
Also, was passiert ist, dass in Ihrem Gebietsschema (was nicht ist
C
)[a-c]
tatsächlich ist[aAbBcC]
. Aus diesem Grund sollten Sie stattdessen die von @karel vorgeschlagenen POSIX-Zeichenklassen verwenden.quelle
LC_COLLATE
anC
, anders zu sein , es ist in Ordnung für andere Ländereinstellungen. Es ist selten eine gute Idee, sichLC_COLLATE
auf etwas anderes einzustellen , aberC
Ubuntu tut es leider (es ist bei weitem nicht der einzige Schuldige).