case
私の目標は、(only +)を使用して数値範囲を検証し、esac
範囲を印刷することです。たとえば、
- 数字が0から80の間に印刷します。
>=0<=80
- 数字が81から100の間に印刷します。
>=81<=100
- など。
以下のスクリプトの問題は、>=0<=90
0から9までの数字のみを印刷することです。数値範囲に応じて正しい出力を印刷するようにスクリプトを変更するにはどうすればよいですか?
#!/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
ベストアンサー1
case
パターンマッチングにのみ使用され、算術評価を実行しません(zsh
の<x-y>
拡張パターンマッチング演算子を考慮しない限り)。ただ[...]
似合う一つ文字(または要素の構成いくつかの実装では)そこに指定されたコレクションに基づいています。たとえば、次のように[0-80]
なります。一つ0
to8
または 1 の場合は文字です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
これらの算術比較値を一致させます。。