测试变量是否是例如一个大于0的数字,你会写:
((i > 0))
但是我如何测试变量not
是否大于0?
修改
抱歉打字错误,意为not a number greater than 0
。
编辑2
寻找可怜的问题。变量的值作为命令行参数传递,因此它可以是数字或不是。这也需要检查。
答案 0 :(得分:9)
i=15
if [[ ! $i -gt 10 ]]; then
echo "lalala"
fi
答案 1 :(得分:8)
要检查不是数字,您必须使用正则表达式进行测试。我使用-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
如果你想测试非整数,你必须在你的问题中澄清什么是数字。
答案 2 :(得分:5)
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 ]]
注意,比较确定验证的整数是否“小于或等于零”,而不是否定它是正整数的断言。因此,只有当正则表达式验证为(可能已签名的)整数时,整个表达式才会返回true(例如退出状态为零),如果整数是带符号的负整数,则返回。
当然还有其他方法可以构建这个表达式,但这是一个相当可读的(如果是Bash特定的)解决方案。
答案 3 :(得分:3)
是的,我意识到这个问题被标记为bash,但没有理由不这样做是可移植的方式:
if ! test "$i" -gt 0 2> /dev/null ; then
echo $i is not a positive integer
fi
答案 4 :(得分:3)
简单的正则表达式可以允许非数字,例如“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