如何测试变量是否是Bash中的数字?
我只是无法弄清楚如何确保传递给我的脚本的参数是否是数字。
我想要做的就是这样的事情:
test *isnumber* $1 && VAR=$1 || echo "need a number"
任何帮助?
一种方法是使用正则表达式,如下所示:
re='^[0-9]+$'
if ! [[ $yournumber =~ $re ]] ; then
echo "error: Not a number" >&2; exit 1
fi
如果该值不一定是整数,则考虑正确修改正则表达式; 例如:
^[0-9]+([.][0-9]+)?$
...或处理负数:
^-?[0-9]+([.][0-9]+)?$
如果没有bashisms(即使在System V中也有效),
case $string in
''|*[!0-9]*) echo bad ;;
*) echo good ;;
esac
这会拒绝包含非数字的空字符串和字符串,接受其他所有内容。
负数或浮点数需要一些额外的工作。 一个想法是排除-
/ .
在第一个“坏”模式中添加更多的“坏”模式,其中包含不适当的用法( ?*-*
/ *.*.*
)
以下解决方案也可以用在基本shell如Bourne中,而不需要正则表达式。 基本上任何数值评估操作的非数字都会导致一个错误,在shell中将被隐式视为false:
"$var" -eq "$var"
如下所示:
#!/bin/bash
var=a
if [ "$var" -eq "$var" ] 2>/dev/null; then
echo number
else
echo not a number
fi
你也可以测试$? 该操作的返回代码更加明确:
"$var" -eq "$var" 2>/dev/null
if [ $? -ne 0 ]; then
echo $var is not number
fi
标准错误的重定向是为了隐藏bash打印出来的“预期的整数表达式”消息,以防我们没有数字。
CAVEATS (感谢下面的评论):
[[ ]]
而不是[ ]
将始终评估为true
true
bash: [[: 1 a: syntax error in expression (error token is "a")
bash: [[: i: expression recursion level exceeded (error token is "i")