case
chỉ cho phù hợp với mô hình, nó sẽ không làm đánh giá số học (ngoại trừ có lẽ nếu bạn xem xét zsh
's <x-y>
điều hành phù hợp với mô hình mở rộng). Các [...]
chỉ để phù hợp với một nhân vật (hoặc yếu tố đối chiếu trong một số triển khai) dựa trên bộ định bên trong. Vì vậy, ví dụ như [0-80]
sẽ phù hợp với một nhân vật nếu nó là một trong những 0
để 8
hoặc 0
(có nghĩa là, một từ 0, 1, 2, 3, 4, 5, 6, 7, 8).
Bạn có thể ghép các số với các mẫu như:
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
Nhưng bạn có thể dễ dàng thấy rằng nó không phải là công cụ phù hợp.
Các ký tự [...]
khớp với một ký tự so với danh sách các ký tự được chỉ định, do đó [121-300]
khớp với bất kỳ ký tự nào là 1, 2, 1 đến 3, 0 hoặc 0, do đó, nó giống như [0-3]
hoặc [0123]
.
Sử dụng:
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
Một cách khác để sử dụng case
sẽ như sau:
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
Hoặc sử dụng toán tử ternary ( 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...
Hoặc như @mikeerv, suy nghĩ bên ngoài hộp, đảo ngược case
logic và khớp 1
với giá trị của những so sánh số học đó .
if [ n < 0 ] - elif [ n <= 80 ] - elif [ n <= 100 ] ... - else
. Ít gõ, ít bị lỗi.