変数がたとえば0より大きい数値であるかどうかをテストするには、次のように記述します。
((i > 0))
しかし、変数がnot
0より大きい数値であるかどうかをどのようにテストしますか?
編集
タイプミスでごめんなさい、意味しnot a number greater than 0
ます。
編集2
悪い質問をしてください。変数の値はコマンドライン引数として渡されるため、数値である場合とそうでない場合があります。これもチェックする必要があります。
変数がたとえば0より大きい数値であるかどうかをテストするには、次のように記述します。
((i > 0))
しかし、変数がnot
0より大きい数値であるかどうかをどのようにテストしますか?
編集
タイプミスでごめんなさい、意味しnot a number greater than 0
ます。
編集2
悪い質問をしてください。変数の値はコマンドライン引数として渡されるため、数値である場合とそうでない場合があります。これもチェックする必要があります。
i=15
if [[ ! $i -gt 10 ]]; then
echo "lalala"
fi
数値でないことを確認するには、正規表現でテストする必要があります。-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
整数以外をテストする場合は、質問で何が数値と見なされるかを明確にする必要があります。
これについては、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 固有の) ソリューションです。
はい、この質問に bash というタグが付けられていることは承知していますが、移植可能な方法でこれを行わない理由はありません。
if ! test "$i" -gt 0 2> /dev/null ; then
echo $i is not a positive integer
fi
単純な正規表現では、「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