case
jest tylko do dopasowania wzorca, to nie zrobi ocenę arytmetyczną (może z wyjątkiem jeśli wziąć pod uwagę zsh
„s <x-y>
rozszerzony wzór pasujący operatora). Należy [...]
dopasować tylko jeden znak (lub element zestawiający w niektórych implementacjach) na podstawie zestawu podanego w. Tak na przykład [0-80]
, że pasuje do jednej postaci, jeśli jest to jeden 0
z 8
albo 0
(to znaczy, jeden z 0, 1, 2, 3, 4, 5, 6, 7, 8).
Możesz dopasować liczby do wzorów takich jak:
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
Ale łatwo można zauważyć, że nie jest to właściwe narzędzie.
[...]
Dopasowuje jeden znak występuje na liście określonych znaków, więc [121-300]
meczów dla każdego znaku, który jest albo 1, 2, 1 do 3, 0 lub 0, więc to jest taka sama jak [0-3]
lub [0123]
.
Posługiwać się:
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
Innym sposobem użycia case
byłoby:
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
Lub użyj operatora trójskładnikowego ( 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...
Lub jak @mikeserv, zastanów się nieszablonowo, odwróć case
logikę i dopasuj 1
do wartości tych porównań arytmetycznych .
if [ n < 0 ] - elif [ n <= 80 ] - elif [ n <= 100 ] ... - else
. Mniej pisania, mniej podatny na błędy.W rzeczywistości jest to naprawdę łatwe do zrobienia. Chodzi o
case
to, że zawsze będzie się powiększać tylko tyle, ile jest potrzebne do znalezienia pierwszego dopasowania do wzorca. To jest określone zachowanie. Możesz więc ustawić go ze znanym ciągiem i ocenić rozszerzenia wzorców.case
nigdy nie rozwinie więcej tych wzorów niż jest to konieczne, aby znaleźć wiodącą 1 we wzorze. Jest to szczególnie ważne podczas pracy z danymi wprowadzanymi przez użytkownika, ponieważ oznacza to, że możesz bezpiecznie zweryfikować zawartość$number
przed próbą umieszczenia jej w kontekście rozwinięcia arytmetycznego w tej samej instrukcji przypadku, w której faktycznie umieścisz ją w rozwinięciu matematycznym.źródło
case
. są pewne fajne rzeczy, które możesz zrobić z$((
matematyką))
icase
- zwłaszcza otaczającymi zadaniami w wzorach, które nigdy się nie zdarzają, dopóki nie będą musiały - i możesz nawet budować parsowania drzew, które rozszerzają zagnieżdżone rekurencje, jeśli zapełnisz wzoryalias
łańcuchem. jest to najszybszy sposób, w jaki udało mi się uzyskać powłokę do wykonywania translacji znaków i zamiany znaków na wartości bajtów. może być dość szybki - C-Locale ASCII + <> ósemkowy najgorszy przypadek to 7 podstawowych rozszerzeń wzorca POSIX.Nie jest to zbyt miłe, ale możesz użyć tego:
źródło