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

2024-03-06 12:42:35 浏览数 (2)

问:

我搞不清楚如何确保传递给我的脚本的参数是否是一个数字。

我想要做的其实就是类似这样的操作:

代码语言:javascript复制
test *isnumber* $1 && VAR=$1 || echo "need a number"

能帮帮我吗?

答:

在 Bash 中,你可以使用几种方法来测试一个变量或参数(如 1、2 等)是否是数字。以下是一种通常的方法,使用条件中的正则表达式来进行测试:

代码语言:javascript复制
#!/bin/bash

# 判断参数是否为数字的函数
is_number() {
    re='^[ -]?[0-9] ([.][0-9] )?$'
    if [[ $1 =~ $re ]]; then
        return 0 # 在 Bash 中,0 表示成功
    else
        return 1 # 非零表示失败
    fi
}

# 使用方法
if is_number "$1"; then
    VAR="$1"
    echo "The variable is a number: $VAR"
else
    echo "Need a number"
fi

解释:

  • is_number 函数使用正则表达式来匹配数字。模式 ^[ -]?[0-9] ([.][0-9] )?$ 将匹配任何整数或浮点数(包括带有正负号的)。
  • [[ 1 =~ re ]] 使用 Bash 的正则表达式匹配运算符来检查
  • return 0 表示输入与模式匹配,而 return 1 表示不匹配。
  • if is_number "

该示例会检查整数和浮点数。如果你只需要检查整数,可以简化正则表达式为 ^[ -]?[0-9] $`。

记得给变量加引号("$1")以防止通配符扩展和单词分割。Bash 对空格和引号非常敏感;不给变量加引号可能会导致意外结果,特别是如果你的输入可能包含空格或特殊字符。

另一种常用的方法是使用 declare 内建命令与 -p(特定)选项和 -i 整数属性。这是使用该方法的示例脚本:

代码语言:javascript复制
#!/bin/bash

VAR=$1

if declare -p VAR >/dev/null && [ "$VAR" -eq "$VAR" ] 2>/dev/null; then
  echo "The variable is a number: $VAR"
else
  echo "Need a number "
fi

然而,这种方法可能有一些不一致性,并且不如正则表达式方法那样健壮,因为 declare 可能在变量不是整数或者 VAR 已经被声明过时并不总是失败。 此外,-eq 测试运算符是为整数比较而设计的,对浮点数无效。

参考文档:

  • stackoverflow question 806906
  • help declare

0 人点赞