case
はパターンマッチング専用であり、算術評価を行いません(多分zsh
の<x-y>
拡張パターンマッチング演算子を検討する場合を除いて)。[...]
一致するだけで1つの文字(または照合要素内に指定されたセットに基づいて、いくつかの実装では)。したがって、たとえば、to またはor (つまり、0、1、2、3、4、5、6、7、8 のいずれか)であれば、1つの文字[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
しかし、それが適切なツールではないことが簡単にわかります。
[...]
試合1つの指定された文字のリストに対して文字なので、[121-300]
3のいずれか1である任意の文字に一致したもの、2、1、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
。タイピングが減り、エラーが発生しにくくなります。