测试零或正整数

测试零或正整数

如何测试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

相关内容