我在 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