このコマンドがrnumが整数であるかどうかを確認する方法を説明してください。

このコマンドがrnumが整数であるかどうかを確認する方法を説明してください。

$rnum数値かどうかをテストするために、シェルスクリプトで次の設定を見たことがあります。

if ! [ "$rnum" -eq "$rnum" ] 2> /dev/null; then
    echo "rnum is not a number"
    exit 1
fi

うまくいくようですが、なぜそうなのか理解できません。何かがそれ自体であるかどうかをテストすることは常に正確であるべきではありませんか?これはどのように/なぜ動作しますか?

答え1

Ulrich Schwarzは彼の意見でこの質問に答えました。ただ無視して整数ではないときに何が起こるのか2>/dev/null見てください。対話型セッションで作成された次の$rnum例を検討してください。bash

$ rnum='foo'
$ [ "$rnum" -eq "$rnum" ]
-bash: [: foo: integer expression expected
$ echo $?
2

値が整数であるかどうかをテストする別の方法を探している場合は、Phrashant Bandが方法を提案しました。しかし、私はより移植性の高いソリューション(=~オペレータに依存しないソリューション)を好みます。

expr "X$rnum" : 'X[-+]\{0,1\}[0-9]\{1,\}$' >/dev/null || {
    echo 'rnum is not a number' >&2
    exit 1
}

-0、、、+0などの奇数の値は000整数として扱われます。ただし、これは質問で提案された元の構成を使用して取得したのと同じ動作です。

答え2

このスクリプトは数値であることを確認します。

num=123
if [[ "$num" =~ ^[0-9]+$ ]]
then
echo "It is Number"
fi

関連情報