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

hel*_*hod 3 bash

要测试变量是否是例如大于0的数字,您可以写:

((i > 0))
Run Code Online (Sandbox Code Playgroud)

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

编辑

抱歉打字错误not a number greater than 0.

编辑2

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

Dan*_*zar 11

i=15
if [[ ! $i -gt 10 ]]; then
        echo "lalala"
fi
Run Code Online (Sandbox Code Playgroud)


Op *_*kel 10

要检查不是数字,您必须使用正则表达式进行测试.我已经使用-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
Run Code Online (Sandbox Code Playgroud)

如果要测试非整数,则必须在您的问题中澄清什么是数字.

  • -1:使用正则表达式是绝对错误的.`test`是专为此类比较而设计的,使用它将不那么脆弱,更易读,更快. (3认同)
  • 任何编程语言中的数字文字都是用"正则表达式"定义的.我不明白这是怎么回事. (2认同)

Tod*_*obs 5

比较

关于Shell算术Bash条件表达式的Bash手册部分清楚地介绍了这一点.

# Shell arithmetic
$ (( -1 <= 0 )); echo $?
0

# Conditional expression
$ [[ -1 -le 0 ]]; echo $?
0

# Negated conditional. Confusing, but possible.
[[ ! -1 -gt 0 ]]; echo $?
0
Run Code Online (Sandbox Code Playgroud)

简单吧?

验证

但是,如果您在执行比较之前尝试测试数字是否实际上是整数,那么您可以使用这样的复合表达式来验证和比较名为int的变量:

[[ "$int" =~ ^[-+]?([1-9][[:digit:]]*|0)$ && "$int" -le 0 ]]
Run Code Online (Sandbox Code Playgroud)

请注意,比较确定验证的整数是否"小于或等于零",而不是否定它是正整数的断言.因此,只有当正则表达式验证为(可能已签名的)整数并且整数是带符号的负整数时,整个表达式才会返回true(例如,退出状态为零).

当然还有其他方法来构造这个表达式,但这是一个相当可读(如果是Bash特定的)解决方案.

相关链接