web-dev-qa-db-ja.com

入力数値が整数かどうかの確認

入力が整数であるかどうかを確認しようとしていますが、100回以上調べましたが、エラーは表示されません。悲しいかな、それは機能せず、すべての入力(数字/文字)のifステートメントをトリガーします

read scale
if ! [[ "$scale" =~ "^[0-9]+$" ]]
        then
            echo "Sorry integers only"
fi

私は引用符をいじってみましたが、それを逃したか、何もしませんでした。何が悪いのでしょうか?入力が単なる整数かどうかをテストする簡単な方法はありますか?

37
lonewarrior556

引用を削除

if ! [[ "$scale" =~ ^[0-9]+$ ]]
    then
        echo "Sorry integers only"
fi
33
jimmij

使用する -eqtest コマンドの演算子:

read scale
if ! [ "$scale" -eq "$scale" ] 2> /dev/null
then
    echo "Sorry integers only"
fi

bashだけでなく、あらゆるPOSIXシェルでも機能します。 POSIX test ドキュメントから:

n1 -eq  n2
    True if the integers n1 and n2 are algebraically equal; otherwise, false.
19
cuonglm

OPは正の整数のみを必要とするようです。

[ "$1" -ge 0 ] 2>/dev/null

例:

$ is_positive_int(){ [ "$1" -ge 0 ] 2>/dev/null && echo YES || echo no; }
$ is_positive_int Word
no
$ is_positive_int 2.1
no
$ is_positive_int -3
no
$ is_positive_int 42
YES

単一の[テストが必要であることに注意してください:

$ [[ "Word" -eq 0 ]] && echo Word equals zero || echo nope
Word equals zero
$ [ "Word" -eq 0 ] && echo Word equals zero || echo nope
-bash: [: Word: integer expression expected
nope

これは、[[で逆参照が発生するためです。

$ Word=other
$ other=3                                                                                                                                                                                  
$ [[ $Word -eq 3 ]] && echo Word equals other equals 3
Word equals other equals 3
8
Tom Hale

符号なし整数の場合、次を使用します。

read -r scale
[ -z "${scale//[0-9]}" ] && [ -n "$scale" ] || echo "Sorry integers only"

テスト:

$ ./test.sh
7
$ ./test.sh
   777
$ ./test.sh
a
Sorry integers only
$ ./test.sh
""
Sorry integers only
$ ./test.sh

Sorry integers only
8
raciasolvo
( scale=${scale##*[!0-9]*}
: ${scale:?input must be an integer}
) || exit

それがチェックを行い、エラーを出力します。

3
mikeserv

確認してください 変数がBashの数値であるかどうかをテストするにはどうすればよいですか stackoverflowページ。このページには、整数をチェックするための他の良い方法がいくつかあります。

2
Reza Harasani

POSIXおよびポータブルソリューションは次のとおりです。

read scale
if     [ -z "${scale##*[!0-9]*}" ]; 
then   echo "Sorry integers only"
fi
0
Isaac