casechỉ 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để 8hoặ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 casesẽ 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 caselogic và khớp 1vớ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.