要测试一个变量是否是一个大于 0 的数字,你可以这样写:
((i > 0))
但是我将如何测试变量是否是not
大于 0 的数字?
编辑
抱歉打错字了,意思是not a number greater than 0
。
编辑 2
抱歉这个可怜的问题。变量的值作为命令行参数传递,因此它可能是一个数字,也可能不是。这也需要检查。
要测试一个变量是否是一个大于 0 的数字,你可以这样写:
((i > 0))
但是我将如何测试变量是否是not
大于 0 的数字?
编辑
抱歉打错字了,意思是not a number greater than 0
。
编辑 2
抱歉这个可怜的问题。变量的值作为命令行参数传递,因此它可能是一个数字,也可能不是。这也需要检查。
i=15
if [[ ! $i -gt 10 ]]; then
echo "lalala"
fi
要检查不是数字,您必须使用正则表达式进行测试。我使用-5
它0
只是为了演示更一般的情况(我的假设是您使用整数):
#!/bin/bash
A=$1
if [[ $A =~ ^[\-0-9]+$ ]] && (( A > -5)); then
echo "A is number and is greater then -5"
else
echo "A is not a number or is <= -5"
fi
如果你想测试非整数,你必须在你的问题中澄清什么被认为是数字。
这在Shell Arithmetic和Bash Conditional Expressions的 Bash 手册部分中有明确的介绍。
# Shell arithmetic
$ (( -1 <= 0 )); echo $?
0
# Conditional expression
$ [[ -1 -le 0 ]]; echo $?
0
# Negated conditional. Confusing, but possible.
[[ ! -1 -gt 0 ]]; echo $?
0
很简单,对吧?
但是,如果您在执行比较之前尝试测试该数字是否实际上是整数,那么您可以使用这样的复合表达式来验证和比较名为int的变量:
[[ "$int" =~ ^[-+]?([1-9][[:digit:]]*|0)$ && "$int" -le 0 ]]
请注意,比较确定验证的整数是否“小于或等于零”,而不是否定它是正整数的断言。因此,只有当正则表达式验证为(可能有符号的)整数并且该整数是有符号负整数时,整个表达式才会返回真(例如,退出状态为零)。
当然还有其他方法可以构造这个表达式,但这是一个相当易读(如果相当 Bash 特定)的解决方案。
是的,我意识到这个问题被标记为 bash,但没有理由不这样做是一种可移植的方式:
if ! test "$i" -gt 0 2> /dev/null ; then
echo $i is not a positive integer
fi
简单的正则表达式可以允许非数字,例如“11--22--99”(尽管它们确实在 内部进行数学计算(())
)。
以下正则表达式仅允许 0 或负整数不带前导零,并拒绝负零。
for a in 0 -0 00 -1 -01 1 1-1 --1
do
if [[ $a =~ ^(-[1-9][0-9]*|0)$ ]]
then
echo "[+] $a passes"
else
echo "[X] $a doesn't"
fi
done
输出:
[+] 0 passes
[X] -0 doesn't
[X] 00 doesn't
[+] -1 passes
[X] -01 doesn't
[X] 1 doesn't
[X] 1-1 doesn't
[X] --1 doesn't
此时,您实际上不需要添加测试,((a <= 0))
尽管您可以测试它是否小于或等于某个较小的数字。
编辑:
您可以将整数验证测试放在一个函数中,并单独进行比较以提高可读性,如下所示:
isint () {
[[ $1 =~ ^(-?[1-9][0-9]*|0)$ ]] # use [+-]? instead of -? to allow "+"
}
if isint "$var" && ((var <= 0))
then
echo "validated and compared: $var"
else
echo "non-integer or out of range: $var"
fi