case
ist nur für den Mustervergleich vorgesehen, führt jedoch keine arithmetische Auswertung durch (außer wenn Sie zsh
den <x-y>
erweiterten Mustervergleichsoperator in Betracht ziehen ). Das [...]
soll nur mit einem Zeichen (oder einem Sortierelement in einigen Implementierungen) übereinstimmen, basierend auf dem darin angegebenen Satz. So zum Beispiel [0-80]
würde Übereinstimmen einen Charakters , wenn es eine von 0
bis 8
oder 0
(das heißt, eines von 0, 1, 2, 3, 4, 5, 6, 7, 8).
Sie können Zahlen mit Mustern wie:
case $(($number)) in
([0-9]|[1-7][0-9]|80) echo ">=0<=80";;
(8[1-9]|9[0-9]|100) echo ">=81<=100";;
... and so on
esac
Aber Sie können leicht erkennen, dass es nicht das richtige Werkzeug ist.
Das [...]
entspricht einem Zeichen mit der Liste der angegebenen Zeichen, entspricht also [121-300]
jedem Zeichen, das entweder 1, 2, 1 bis 3, 0 oder 0 ist. Es ist also dasselbe wie [0-3]
oder [0123]
.
Benutzen:
if [ "$number" -ge 0 ] && [ "$number" -le 80 ]; then
echo ">=0<=80"
elif [ "$number" -ge 81 ] && [ "$number" -le 100 ]; then
echo ">=81<=100"
elif ... and so on
...
fi
Eine andere Art zu verwenden case
wäre wie:
case $((
(number >= 0 && number <= 80) * 1 +
(number > 80 && number <= 100) * 2 +
(number > 100 && number <= 120) * 3 +
(number > 120 && number <= 300) * 4)) in
(1) echo ">=0<=80";;
(2) echo ">=81<=100";;
(3) echo ">=101<=120";;
(4) echo ">=121<=300";;
(0) echo "None of the above";;
esac
Oder verwenden Sie den ternären Operator ( x ? y : z
):
case $((
number >= 0 && number <= 80 ? 1 :
number > 80 && number <= 100 ? 2 :
number > 100 && number <= 120 ? 3 :
number > 120 && number <= 300 ? 4 : 0)) in...
Oder denken Sie wie bei @mikeserv über den Tellerrand hinaus, kehren Sie die case
Logik um und vergleichen Sie sie mit 1
dem Wert dieser arithmetischen Vergleiche .
if [ n < 0 ] - elif [ n <= 80 ] - elif [ n <= 100 ] ... - else
. Weniger tippen, weniger fehleranfällig.Eigentlich ist das ganz einfach. Die Sache dabei
case
ist, dass es sich immer nur so weit ausdehnt, wie es nötig ist, um die erste Übereinstimmung mit einem Muster zu finden. Das ist spezifiziertes Verhalten. Sie können es also einfach mit einer bekannten Zeichenfolge einrichten und die Erweiterungen der Muster auswerten.case
wird niemals mehr dieser Muster erweitern als nötig, um eine führende 1 im Muster zu finden. Dies ist besonders wichtig, wenn Sie mit Benutzereingaben arbeiten, da Sie den Inhalt sicher überprüfen können,$number
bevor Sie versuchen, ihn in einen arithmetischen Erweiterungskontext in derselben case-Anweisung zu stellen, in der Sie ihn tatsächlich in eine mathematische Erweiterung einfügen.quelle
case
. Es gibt einige coole Dinge, die Sie mit$((
Mathematik tun können -))
undcase
insbesondere Aufgaben in Mustern, die erst dann auftreten, wenn sie benötigt werden - und Sie können sogar Analysebäume erstellen, die verschachtelte Rekursionen erweitern, wenn Sie die Muster mit eineralias
Kette füllen. Es ist der schnellste Weg, eine Shell dazu zu bringen, Dinge wie die Zeichenübersetzung zu erledigen und Zeichen gegen Bytewerte auszutauschen. es kann ziemlich schnell sein - C-Locale ASCII + <> oktal sehr schlimmster Fall sind 7 grundlegende POSIX-Mustererweiterungen.Das ist nicht sehr schön, aber Sie können dies verwenden:
quelle