在Bash中如何测试一个变量是否为数字?

866

我无法弄清楚如何确保传递给我的脚本的参数是数字还是其他类型。

我想要做的只是像这样:

test *isnumber* $1 && VAR=$1 || echo "need a number"

需要帮助吗?


21
顺便提一下 - 你正在使用的 test && echo "foo" && exit 0 || echo "bar" && exit 1 方法可能会产生一些意想不到的副作用 - 如果 Echo 失败了(也许输出到了一个关闭的FD),exit 0 将被跳过,然后代码将尝试 echo "bar"。如果这也失败了,&& 条件将失败,甚至不会执行 exit 1! 使用实际的 if 语句而不是 &&/|| 更不容易出现意外的副作用。 - Charles Duffy
12
有点晚参加派对了,但我知道Charles所写的危险性,因为我之前也经历过。这里是一个100%无懈可击(而且易于阅读)的命令行:[[ $1 =~ "^[0-9]+$" ]] && { echo "number"; exit 0; } || { echo "not a number"; exit 1; } 大括号表示不应该在子shell中执行事情(如果使用圆括号 () 就会明确这种情况)。注意:永远不要漏掉最后的分号。否则,你可能会导致bash打印出最丑陋(并且毫无意义)的错误消息... - syntaxerror
8
除非您不删除引号,否则它在Ubuntu中无法正常工作。因此,应该只是 [[ 12345 =~ ^ [0-9] + $]] && echo OKKK || echo NOOO - Treviño
7
请提供更具体的信息,说明您所说的“number”是指什么。指整数?定点数?科学(“e”)表示法?是否需要在特定范围内(例如64位无符号值),或者允许任何可写成数字形式的数字? - Toby Speight
2
Bash确实提供了一种可靠的方法来确定一个数字是否为整数。{ VAR="asdfas" ; (( VAR )) ; echo $?; } 如果答案是'0',则该方程将正确失败,因为'0'不是整数。我几分钟前也遇到了同样的问题,并通过快速搜索找到了这个线程。我希望这能帮助其他人。其他人也接近了。 - That one guy from the movie
显示剩余5条评论
41个回答

-5

这个还有点粗糙,但对于新手来说更友好一些。

if [ $number -ge 0 ]
then
echo "Continue with code block"
else
echo "We matched 0 or $number is not a number"
fi

如果$number不是一个数字,这将导致错误并打印"Illegal number:",但它不会中断脚本。奇怪的是,我找不到一个测试选项来测试整数。

这里的逻辑将匹配大于或等于0的任何数字。


2
你的测试漏掉了0,更不用说负数了。 - Gilles 'SO- stop being evil'
此外,这需要使用[[ ]]而不是[ ],否则会在非整数字符串上失败。 - naught101
1
[ "$number" -ge 0 2>/dev/null ] && echo isNumber || echo noNumber - defim
-ge 表示大于等于,因此不应该漏掉 0,但会漏掉负数。以上解决方案也更好,因为 [[ ]] 对于 @defim 的答案总是会得到一个数字,但对于 [ ] 来说则会生成一个错误并评估为 false。 - Marcus
抱歉,上面忘记了负号。对于所有的用途:[ "$number" -eq "$number" 2>/dev/null ] && echo isNumber || echo noNumber - defim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接