问:
我搞不清楚如何确保传递给我的脚本的参数是否是一个数字。
我想要做的其实就是类似这样的操作:
test *isnumber* $1 && VAR=$1 || echo "need a number"
能帮帮我吗?
答:
在 Bash 中,你可以使用几种方法来测试一个变量或参数(如 1、2 等)是否是数字。以下是一种通常的方法,使用条件中的正则表达式来进行测试:
#!/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
解释:
该示例会检查整数和浮点数。如果你只需要检查整数,可以简化正则表达式为 ^[+-]?[0-9]+$`。
记得给变量加引号("$1")以防止通配符扩展和单词分割。Bash 对空格和引号非常敏感;不给变量加引号可能会导致意外结果,特别是如果你的输入可能包含空格或特殊字符。
另一种常用的方法是使用 declare 内建命令与 -p(特定)选项和 -i 整数属性。这是使用该方法的示例脚本:
#!/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 测试运算符是为整数比较而设计的,对浮点数无效。
参考文档: