$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