case
เป็นเพียงสำหรับการจับคู่แบบมันจะไม่ทำการประเมินผลทางคณิตศาสตร์ (ยกเว้นบางทีถ้าคุณพิจารณาzsh
ของ<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
พิจารณา พิมพ์น้อยลงมีข้อผิดพลาดน้อยลง