0または0より大きいことを確認する条件を入力する方法

0または0より大きいことを確認する条件を入力する方法

Caseを使用してこの機能を実行しようとしています。

if [[ $input -gt 0 || $input -eq 0 ]];

場合に備えて、入力がゼロより大きいか、ゼロに等しいか、さらにゼロでゼロより小さいかをテストするためにケースを置くことはできますか?

答え1

このスクリプト例shは、変数が整数であることを確認します。

#!/bin/sh

num=$1

if [ $num -eq $num ] 2> /dev/null
then
    case 1 in
        $(($num < 0))     ) echo $num is negative.;;
        $(($num <= 100))  ) echo $num is between 0 and 100.;;
        $(($num <= 1000)) ) echo $num is between 100 and 1000.;;
        *                 ) echo $num is greater than 1000.;;
    esac
else
    echo $num is not a number.
fi

変数が数値であることを確認するために演算子を使用します-eqstderr数値でない場合は、出力を抑制する必要があります。

変数に整数が含まれている場合、caseレイアウトフォームの範囲が評価されます。式は$(( some comparison ))true(1)またはfalse(0)として評価されるため、指定された範囲のリストをテストできます。

答え2

整数を正しく処理せずに整数のみを処理する必要がある場合は、-0次のようになります。

case "$input" in
''|*[!0-9-]*|[0-9-]*-*)
  echo "invalid input"      
  ;;
[0-9]*)
  echo "input >= 0"
  ;;
-[1-9]*)
 echo "input < 0"
 ;;
*)
 echo "invalid input"
 ;;
esac

if .. then .. elif ... then .. else .. ficaseただし、パターンマッチングを使用するよりも複雑な式がある場合を区別するために構文を使用する方が良い場合がよくあります。

答え3

[ "$input" -gt -1 ] || exit

...または...

case ${input:?NULL} in 
(?*[!0-9]*|[!-0-9]*|[!0-9]) ! : ;;
(-*[!0]*)  echo \<0 ;;
(*[!0]*)   echo \>1 ;;
(0*)       echo 0   ;;
esac 

答え4

case $([[ $input =~ ^-?[0-9]+$ ]] && [[ $input -gt 0 || $input -eq 0 ]] ; echo $?) in
0)
        echo "good"
        ;;
1)
        echo "bad"
        ;;
*)
        echo "weird"
        ;;
esac

ケース内部の複雑さが気に入らない場合、少なくとも正規表現のマッチングはうまく機能し、簡単です。

関連情報