case + in caseの構文と同じか小さいか大きいかを実装する方法

case + in caseの構文と同じか小さいか大きいかを実装する方法

case私の目標は、(only +)を使用して数値範囲を検証し、esac範囲を印刷することです。たとえば、

  • 数字が0から80の間に印刷します。>=0<=80
  • 数字が81から100の間に印刷します。>=81<=100
  • など。

以下のスクリプトの問題は、>=0<=900から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]なります。一つ0to8または 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これらの算術比較値を一致させます。

おすすめ記事