检查输入数字是否为整数

检查输入数字是否为整数

我试图检查输入是否为整数,我已经检查了一百遍,但没有发现错误。唉,它不起作用,它会触发所有输入(数字/字母)的 if 语句

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

我已经尝试过引用这些引号,但要么错过了它,要么什么也没做。我做错了什么?有没有更简单的方法来测试输入是否只是一个整数?

答案1

删除引号

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

答案2

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

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

它不仅适用于bash任何 POSIX shell。来自 POSIX测试文档:

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

答案3

由于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

答案4

对于无符号整数,我使用:

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

相关内容