如何测试变量是否*不是正整数?

时间:2012-06-05 14:34:20

标签: bash

测试变量是否是例如一个大于0的数字,你会写:

((i > 0))

但是我如何测试变量not是否大于0?

修改

抱歉打字错误,意为not a number greater than 0

编辑2

寻找可怜的问题。变量的值作为命令行参数传递,因此它可以是数字或不是。这也需要检查。

5 个答案:

答案 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 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 ]]

注意,比较确定验证的整数是否“小于或等于零”,而不是否定它是正整数的断言。因此,只有当正则表达式验证为(可能已签名的)整数时,整个表达式才会返回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