6

要测试一个变量是否是一个大于 0 的数字,你可以这样写:

((i > 0))

但是我将如何测试变量是否是not大于 0 的数字?

编辑

抱歉打错字了,意思是not a number greater than 0

编辑 2

抱歉这个可怜的问题。变量的值作为命令行参数传递,因此它可能是一个数字,也可能不是。这也需要检查。

4

5 回答 5

12
i=15
if [[ ! $i -gt 10 ]]; then
        echo "lalala"
fi
于 2012-06-05T14:36:38.787 回答
10

要检查不是数字,您必须使用正则表达式进行测试。我使用-50只是为了演示更一般的情况(我的假设是您使用整数):

#!/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

如果你想测试非整数,你必须在你的问题中澄清什么被认为是数字。

于 2012-06-05T14:56:41.173 回答
5

比较

这在Shell ArithmeticBash 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 特定)的解决方案。

相关链接

于 2012-06-05T15:29:49.257 回答
4

是的,我意识到这个问题被标记为 bash,但没有理由不这样做是一种可移植的方式:

if ! test "$i" -gt 0 2> /dev/null ; then
   echo $i is not a positive integer
fi
于 2012-06-05T14:41:11.957 回答
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
于 2012-06-05T16:26:22.080 回答