检查输入数字是否为整数

lon*_*556 53 bash quoting regular-expression test

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

read scale
if ! [[ "$scale" =~ "^[0-9]+$" ]]
        then
            echo "Sorry integers only"
fi
Run Code Online (Sandbox Code Playgroud)

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

jim*_*mij 49

删除引号

if ! [[ "$scale" =~ ^[0-9]+$ ]]
    then
        echo "Sorry integers only"
fi
Run Code Online (Sandbox Code Playgroud)


cuo*_*glm 26

使用test命令的-eq操作符:

read scale
if ! [ "$scale" -eq "$scale" ] 2> /dev/null
then
    echo "Sorry integers only"
fi
Run Code Online (Sandbox Code Playgroud)

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

n1 -eq  n2
    True if the integers n1 and n2 are algebraically equal; otherwise, false.
Run Code Online (Sandbox Code Playgroud)

  • 好主意,但有点吵。我宁愿不必将错误重定向到 dev null。 (3认同)
  • @lonewarrior556:它仅适用于整数,请参阅:http://pubs.opengroup.org/onlinepubs/9699919799/utilities/test.html。我猜您说的是任何数字,因为您使用新测试 `[[` 而不是我的旧测试 `[`。 (2认同)
  • @Wildcard:是的,我们为便携性付费。 (2认同)

Tom*_*ale 14

由于 OP 似乎只想要正整数:

[ "$1" -ge 0 ] 2>/dev/null
Run Code Online (Sandbox Code Playgroud)

例子:

$ 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
Run Code Online (Sandbox Code Playgroud)

请注意,需要进行一次[测试:

$ [[ "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
Run Code Online (Sandbox Code Playgroud)

这是因为取消引用发生在[[:

$ word=other
$ other=3                                                                                                                                                                                  
$ [[ $word -eq 3 ]] && echo word equals other equals 3
word equals other equals 3
Run Code Online (Sandbox Code Playgroud)


小智 12

POSIX 和便携式解决方案是:

read scale
if     [ -z "${scale##*[!0-9]*}" ]; 
then   echo "Sorry integers only"
fi
Run Code Online (Sandbox Code Playgroud)

  • 到目前为止,最好的答案是太多人不使用参数扩展。这也适用于数组,包括 $@: params=("${@##*[!0-9]*}") -- 保留所有位置参数,但仅使用数字 - 其他任何内容都将转换为空字符串它在算术评估中方便地评估为 0(我的用例 - 函数参数是整数列表,未设置或 null 应默认为 0,但调用者在未设置时设置变量名称)。 (3认同)

rac*_*lvo 9

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

read -r scale
[ -z "${scale//[0-9]}" ] && [ -n "$scale" ] || echo "Sorry integers only"
Run Code Online (Sandbox Code Playgroud)

测试:

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

Sorry integers only
Run Code Online (Sandbox Code Playgroud)


mik*_*erv 5

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

这会进行检查并输出您的错误。