请说明该命令如何检查 rnum 是否为整数

请说明该命令如何检查 rnum 是否为整数

我在 shell 脚本中看到了这样的构造,用于测试是否$rnum是数字:

if ! [ "$rnum" -eq "$rnum" ] 2> /dev/null; then
    echo "rnum is not a number"
    exit 1
fi

它似乎有效,但我不明白为什么——测试某些东西是否与自身相等不应该总是正确的吗?这是如何/为什么有效的?

答案1

乌尔里希·施瓦茨确实在他的评论中回答了这个问题。只需忽略2>/dev/null,看看当$rnum不是整数时会发生什么。考虑以下在交互式bash会话中编写的示例:

$ rnum='foo'
$ [ "$rnum" -eq "$rnum" ]
-bash: [: foo: integer expression expected
$ echo $?
2

如果您正在寻找一种替代方法来测试某个值是否为整数,Prashant Band 已经给出了一种方法。但是,我更喜欢一种更便携的解决方案(不依赖于=~操作员的解决方案):

expr "X$rnum" : 'X[-+]\{0,1\}[0-9]\{1,\}$' >/dev/null || {
    echo 'rnum is not a number' >&2
    exit 1
}

请注意,诸如-0+0、 和 之类的奇怪值000被视为整数。但是,这与使用问题中提出的原始构造所得到的行为相同。

答案2

该脚本检查它是否是数字:

num=123
if [[ "$num" =~ ^[0-9]+$ ]]
then
echo "It is Number"
fi

相关内容