入力番号が整数かどうかを確認する


31

入力が整数かどうかを確認しようとしていますが、100回入力を繰り返しましたが、このエラーは表示されません。残念ながら機能しません。すべての入力(数値/文字)のifステートメントをトリガーします

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

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

回答:


25

引用符を削除する

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


バグがあります。引用符を使用すると、正規表現はリテラル文字列として扱われます。それを確認するにはscale='^[0-9]+$'; [[ "$scale" == "^[0-9]+$" ]] && echo equal || echo "not equal"
jimmij 14

15

テストコマンドの-eq演算子を使用します。

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

それだけでbashなく、POSIXシェルでも動作します。POSIX テストドキュメントから:

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

そのその任意の数だけではなく、整数かどうかを確認する
lonewarrior556

2
@ lonewarrior556:それは整数のためにのみ動作し、以下を参照してください。pubs.opengroup.org/onlinepubs/9699919799/utilities/test.htmlを。私[[の古いテストの代わりに新しいテストを使用しているので、あなたは任意の数について言ったと思う[
クオンルム14

良い考えですが、少しうるさいです。エラーをdev nullにリダイレクトする必要はありません。
ワイルドカード

2
@Wildcard:はい、私たちは携帯性のためにそれを支払います。
cuonglm

8

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

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

1
私はそれが組み込みで作られているので、それが好きで、高速で、かなりposixのようです...古いシェル(bash 2.0.5)で試してみましたが、完璧に動作します。
オリヴィエデュラック

引数内のスペースはどうですか?同様に」086「
-0andriy

@ 0andriy 2番目のテストを参照してください。
raciasolvo

8

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

これが本当の答えです...他の人は失敗しました
Scott Stensland

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

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


OPTINDここもいいです サイヤ人だけ。
mikeserv

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.