检查输入数字是否为整数


31

我正在尝试检查输入是否为整数,并且已经遍历了一百次,但是没有看到错误。las,它不起作用,它会触发所有输入(数字/字母)的if语句

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

我玩过引号,但要么错过了它,要么什么都没做。我做错了什么?有没有更简单的方法来测试输入是否仅仅是INTEGER?

Answers:



15

使用测试命令的-eq运算符:

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

它不仅可以在bashPOSIX shell中使用,而且也可以在其中使用。从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。我想您说的是任何数字,因为您使用的是新测试[[而不是旧测试[
cuonglm

好主意,但有点吵。我宁愿不必将错误重定向到dev null。
2016年

2
@Wildcard:是的,我们为可移植性付费。
cuonglm '16

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
我喜欢它,因为它是用内置函数制作的,速度快,而且看起来很正定。。。
奥利维尔·杜拉克

那参数里面的空格呢?如“ 086”
0andriy

@ 0andriy参见第二项测试。
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 '18 -10-29

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.