Shell
case + 如何在 case 語法中實現等於或小於或大於
我的目標是使用(僅使用
case
+esac
)驗證數字範圍,並列印範圍。例如:
- 如果數字在 0 到 80 之間,則列印
>=0<=80
- 如果數字在 81 到 100 之間,則列印
>=81<=100
- 等等
僅當數字介於 0 和 9 之間時,我的腳本的問題才列印
>=0<=90
。如何修復我的腳本,以便它根據數字範圍列印正確的輸出?#!/bin/ksh read number case $number in [0-80]) echo ">=0<=80";; [81-100]) echo ">=81<=100";; [101-120]) echo ">=101<=120";; [121-300]) echo ">=121<=300";; esac
case
僅用於模式匹配,它不會進行算術評估(除非您考慮擴展模式匹配運算符)zsh
。僅基於其中指定的集合匹配一個字元(或某些實現中的<x-y>
整理元素)*。*因此,例如,如果一個字元是to或之一(即 0、1、2、3、4、5、6、7、8 之一),它將匹配一個字元。[...]``[0-80]``0``8``0
您可以將數字與以下模式匹配:
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]
or相同[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
那些算術比較的值。