0または正の整数テスト

0または正の整数テスト

bashスクリプトの数が0(0)か正の整数であるかをテストする方法は?

答え1

一般的なイディオムは、変数の値が数値でのみ構成されていることを確認することです。最新のbashシェルでは=~正規表現を使用できます。

zero_or_positive_integer(){
    for i in "$@"; do
        if [[ "$i" =~ ^[0-9]+$ ]]; then
            echo "YES $i is either 0 or a positive integer"
        else
            echo "NO $i is neither 0 nor a positive integer"
        fi
    done
}

結果:

$ zero_or_positive_integer foo -2 1.5 0 12
NO foo is neither 0 nor a positive integer
NO -2 is neither 0 nor a positive integer
NO 1.5 is neither 0 nor a positive integer
YES 0 is either 0 or a positive integer
YES 12 is either 0 or a positive integer

答え2

テストするには通常、[or[[演算子が使用されます。[命令の同義語ですtest(Bashの一部ではありません)。

$ help [
[: [ arg... ]
    Evaluate conditional expression.
    
    This is a synonym for the "test" builtin, but the last argument must
    be a literal `]', to match the opening `['.
$ man test
[...]
       INTEGER1 -eq INTEGER2
              INTEGER1 is equal to INTEGER2
       INTEGER1 -ge INTEGER2
              INTEGER1 is greater than or equal to INTEGER2
[...]

したがって、書くことができるように見えます(スペースを忘れないでください。[ただ組み込みのものなので、引数を分離してください)。

if [ "$var" -eq 0 ]; then
  echo "Zero"
elif [ "$var" -gt 0 ]; then
  echo "Positive"
fi

$var整数でないとエラーが発生することに注意してください。私たちは$varそれがすでに整数であると仮定します。

$varこれが整数かどうかわからない場合は、これが良いテストであるかどうかわからないため、正規表現を使用するコードは次のようになります。

if [[ "$var" =~ ^[1-9][0-9]+$ ]]; then
  echo "Positive"
elif [[ "$var" = 0 ]]; then
  echo "Zero"
else
  echo "Other"
fi

答え3

Bashprintf組み込み関数は文字列を読み取り、フォーマット文字列で指定されているとおりに正常に変換できることを確認します。 「${?}」のステータスを確認し、 を使用-vして一時変数に値を入力し、 を使用してエラーメッセージを削除できます2>/dev/null

$ a=-56
$ printf -v q '%d' "${a}"; echo $? "${q}"
0 -56
$ a=-56.3
$ printf -v q '%d' "${a}"; echo $? "${q}"
bash: printf: -56.3: invalid number
1 -56
$ a=315.8e4
$ printf -v q '%d' "${a}"; echo $? "${q}"
bash: printf: 315.8e4: invalid number
1 315
$ printf -v q '%f' "${a}"; echo $? "${q}"
0 3158000.000000

関連情報