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.Sebenarnya ini sangat mudah dilakukan. Masalahnya
case
adalah bahwa ia akan selalu berkembang hanya sebanyak yang diperlukan untuk menemukan kecocokan pertama melawan suatu pola. Itu perilaku khusus. Jadi Anda bisa mengaturnya dengan string yang dikenal dan mengevaluasi ekspansi pola.case
tidak akan pernah memperluas lebih dari pola-pola itu daripada harus untuk menemukan 1 terkemuka dalam pola. Ini sangat penting ketika bekerja dengan input pengguna, karena itu berarti Anda dapat dengan aman memverifikasi konten$number
sebelum mencoba memasukkannya ke dalam konteks ekspansi aritmatika dalam pernyataan kasus yang sama di mana Anda benar-benar memasukkannya ke dalam ekspansi matematika.sumber
case
. ada beberapa hal keren yang dapat Anda lakukan dengan$((
matematika))
dancase
- terutama tugas-tugas di sekitarnya dalam pola yang tidak pernah terjadi sampai mereka perlu - dan Anda bahkan dapat membangun pohon parse yang memperluas rekursi bersarang jika Anda mengisi pola denganalias
rantai. ini adalah cara tercepat yang pernah saya temukan untuk mendapatkan shell untuk melakukan hal-hal seperti terjemahan karakter dan untuk menukar karakter dengan nilai byte. itu bisa sangat cepat - C-Lokal ASCII + <> oktal kasus terburuk adalah 7 perluasan pola POSIX dasar.Ini tidak terlalu bagus tetapi Anda dapat menggunakan ini:
sumber