case
hanya untuk pencocokan pola, tidak akan melakukan evaluasi aritmatika (kecuali mungkin jika Anda mempertimbangkan zsh
's <x-y>
Operator pencocokan pola diperpanjang). The [...]
hanya untuk mencocokkan satu karakter (atau menyusun unsur dalam beberapa implementasi) berdasarkan pada set yang ditentukan dalam. Jadi misalnya [0-80]
akan cocok satu karakter jika salah satu dari 0
ke 8
atau 0
(yaitu, salah satu dari 0, 1, 2, 3, 4, 5, 6, 7, 8).
Anda dapat mencocokkan angka dengan pola seperti:
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
Tetapi Anda dapat dengan mudah melihat bahwa itu bukan alat yang tepat.
The [...]
cocok satu karakter terhadap daftar karakter yang ditentukan, sehingga [121-300]
pertandingan untuk setiap karakter yang baik 1, 2, 1 sampai 3, 0 atau 0, jadi sama dengan [0-3]
atau [0123]
.
Menggunakan:
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
Cara lain untuk digunakan case
adalah:
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
Atau gunakan operator 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...
Atau seperti @mikeserv, pikirkan di luar kotak, balikkan case
logika dan cocokkan 1
dengan nilai perbandingan aritmatika tersebut .
if [ n < 0 ] - elif [ n <= 80 ] - elif [ n <= 100 ] ... - else
. Lebih sedikit mengetik, lebih sedikit kesalahan.