case
тільки для зіставлення з зразком, він не буде виконувати арифметичні обчислення ( за винятком , може бути , якщо ви вважаєте zsh
«s <x-y>
розширений оператор зіставлення з зразком). Потрібно [...]
лише відповідати одному символу (або збірному елементу в деяких реалізаціях) на основі набору, визначеного всередині. Так, наприклад , [0-80]
буде відповідати один символ , якщо це один з 0
до 8
або 0
(тобто, один з 0, 1, 2, 3, 4, 5, 6, 7, 8).
Ви можете зіставити числа за допомогою таких моделей:
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
Але ви легко бачите, що це не правильний інструмент.
[...]
Відповідає один символ проти списку заданих символів, так [121-300]
сірників для будь-якого символу, або 1, 2, 1 до 3, 0 або 0, так що це так само , як [0-3]
і [0123]
.
Використання:
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
Іншим способом використання case
буде такий:
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
Або скористайтеся потрійним оператором ( 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...
Або як @mikeserv, мислити нестандартно, звернути case
логіку і відповідність 1
із значенням цих арифметичних порівнянь .
if [ n < 0 ] - elif [ n <= 80 ] - elif [ n <= 100 ] ... - else
. Менше вводити, менше схильних до помилок.