如何测试变量是否是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
  • 大多数非Bash shell总是将这个表达式评估为true
  • Bash中的行为没有记录,因此可能会在没有警告的情况下更改
  • 如果值包含数字后面的空格(例如“1”)会产生错误,如bash: [[: 1 a: syntax error in expression (error token is "a")
  • 如果value与var-name相同(例如i =“i”),则会产生错误,如bash: [[: i: expression recursion level exceeded (error token is "i")
  • 链接地址: http://www.djcxy.com/p/57149.html

    上一篇: How do I test if a variable is a number in Bash?

    下一篇: Sed not finding and replacing