问:
我搞不清楚如何确保传递给我的脚本的参数是否是一个数字。
我想要做的其实就是类似这样的操作:
代码语言: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