6

変数がたとえば0より大きい数値であるかどうかをテストするには、次のように記述します。

((i > 0))

しかし、変数がnot0より大きい数値であるかどうかをどのようにテストしますか?

編集

タイプミスでごめんなさい、意味しnot a number greater than 0ます。

編集2

悪い質問をしてください。変数の値はコマンドライン引数として渡されるため、数値である場合とそうでない場合があります。これもチェックする必要があります。

4

5 に答える 5

12
i=15
if [[ ! $i -gt 10 ]]; then
        echo "lalala"
fi
于 2012-06-05T14:36:38.787 に答える
10

数値でないことを確認するには、正規表現でテストする必要があります。-5代わりに、より一般的なケースを示すために使用0しました(私の仮定は、整数を使用することです):

#!/bin/bash

A=$1

if [[ $A =~ ^[\-0-9]+$ ]] && (( A > -5)); then
  echo "A is number and is greater then -5"
else
  echo "A is not a number or is <= -5"
fi

整数以外をテストする場合は、質問で何が数値と見なされるかを明確にする必要があります。

于 2012-06-05T14:56:41.173 に答える
5

比較

これについては、Bash マニュアルのShell ArithmeticおよびBash Conditional Expressionsセクションで明確に説明されています。

# Shell arithmetic
$ (( -1 <= 0 )); echo $?
0

# Conditional expression
$ [[ -1 -le 0 ]]; echo $?
0

# Negated conditional. Confusing, but possible.
[[ ! -1 -gt 0 ]]; echo $?
0

シンプルですね。

検証

ただし、比較を実行する前に数値が実際に整数かどうかをテストしようとしている場合は、次のような複合式を使用してintという名前の変数を検証および比較できます。

[[ "$int" =~ ^[-+]?([1-9][[:digit:]]*|0)$ && "$int" -le 0 ]]

比較では、正の整数であるという主張を否定するのではなく、検証された整数が「ゼロ以下」であるかどうかを判断することに注意してください。したがって、正規表現が (おそらく符号付きの) 整数として検証され、整数が符号付きの負の整数である場合にのみ、式全体が true (たとえば、ゼロの終了ステータス) を返します

この式を構築する方法は確かに他にもありますが、これはかなり読みやすい (むしろ Bash 固有の) ソリューションです。

関連リンク

于 2012-06-05T15:29:49.257 に答える
4

はい、この質問に bash というタグが付けられていることは承知していますが、移植可能な方法でこれを行わない理由はありません。

if ! test "$i" -gt 0 2> /dev/null ; then
   echo $i is not a positive integer
fi
于 2012-06-05T14:41:11.957 に答える
3

単純な正規表現では、「11--22--99」などの非数値を許可できます (ただし、 内で数学的に評価されます(()))。

次の正規表現は、先行ゼロのない 0 または負の整数のみを許可し、負のゼロを拒否します。

for a in 0 -0 00 -1 -01 1 1-1 --1
do
    if [[ $a =~ ^(-[1-9][0-9]*|0)$ ]]
    then
        echo "[+] $a passes"
    else
        echo "[X] $a doesn't"
    fi
done

出力:

[+] 0 passes
[X] -0 doesn't
[X] 00 doesn't
[+] -1 passes
[X] -01 doesn't
[X] 1 doesn't
[X] 1-1 doesn't
[X] --1 doesn't

この時点では、テストを追加する必要はありませんが、((a <= 0))それよりも小さい数値かどうかをテストすることはできます。

編集:

次のように、整数の検証テストを関数に入れ、読みやすさのために個別に比較を行うことができます。

isint () {
    [[ $1 =~ ^(-?[1-9][0-9]*|0)$ ]] # use [+-]? instead of -? to allow "+"
}

if isint "$var" && ((var <= 0))
then
    echo "validated and compared: $var"
else
    echo "non-integer or out of range: $var"
fi
于 2012-06-05T16:26:22.080 に答える