case
只进行模式匹配,也不会做算术评估(如果你考虑也许除外zsh
的<x-y>
扩展模式匹配运算符)。的[...]
是仅匹配一个(或字符排序元素基于内指定的集合在一些实施方式)。因此,例如,[0-80]
如果一个字符是0
to 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
。更少的打字,更少的错误。