如何测试bash
脚本中的数字是0
(零)还是正整数?
答案1
常见的习惯用法是检查变量的值是否仅由数字组成。对于较新的 bash shell,您可以使用=~
正则表达式:
zero_or_positive_integer(){
for i in "$@"; do
if [[ "$i" =~ ^[0-9]+$ ]]; then
echo "YES $i is either 0 or a positive integer"
else
echo "NO $i is neither 0 nor a positive integer"
fi
done
}
结果是:
$ zero_or_positive_integer foo -2 1.5 0 12
NO foo is neither 0 nor a positive integer
NO -2 is neither 0 nor a positive integer
NO 1.5 is neither 0 nor a positive integer
YES 0 is either 0 or a positive integer
YES 12 is either 0 or a positive integer
答案2
要进行测试,通常使用[
or[[
运算符。[
是命令的同义词test
(不是 Bash 的一部分)
$ help [
[: [ arg... ]
Evaluate conditional expression.
This is a synonym for the "test" builtin, but the last argument must
be a literal `]', to match the opening `['.
$ man test
[...]
INTEGER1 -eq INTEGER2
INTEGER1 is equal to INTEGER2
INTEGER1 -ge INTEGER2
INTEGER1 is greater than or equal to INTEGER2
[...]
所以看起来你可以写(不要忘记空格——[
只是一个内置程序,所以将其参数分开)
if [ "$var" -eq 0 ]; then
echo "Zero"
elif [ "$var" -gt 0 ]; then
echo "Positive"
fi
请注意,如果$var
不是整数,则会导致错误。我们假设$var
已经是某个整数了。
如果您不确定这$var
是一个整数,我不知道这是一个很好的测试,所以这里有一些使用正则表达式的代码:
if [[ "$var" =~ ^[1-9][0-9]+$ ]]; then
echo "Positive"
elif [[ "$var" = 0 ]]; then
echo "Zero"
else
echo "Other"
fi
答案3
Bashprintf
内置函数将读取字符串并验证它是否可以按照格式字符串指定的方式成功转换。您可以检查状态“${?}”,使用-v
将值放入临时变量,并使用 丢弃错误消息2>/dev/null
。
$ a=-56
$ printf -v q '%d' "${a}"; echo $? "${q}"
0 -56
$ a=-56.3
$ printf -v q '%d' "${a}"; echo $? "${q}"
bash: printf: -56.3: invalid number
1 -56
$ a=315.8e4
$ printf -v q '%d' "${a}"; echo $? "${q}"
bash: printf: 315.8e4: invalid number
1 315
$ printf -v q '%f' "${a}"; echo $? "${q}"
0 3158000.000000