检查bash变量是否等于0

我有一个bash变量深度,我想测试它是否等于0。如果是,我想停止执行脚本。到目前为止,我有:

zero=0;


if [ $depth -eq $zero ]; then
echo "false";
exit;
fi

不幸的是,这会导致:

 [: -eq: unary operator expected

(由于翻译原因,可能有点不准确)

请问,我如何修改我的脚本让它工作?

499728 次浏览

看起来你的depth变量没有设置。这意味着在bash将变量的值替换到表达式中之后,表达式[ $depth -eq $zero ]变成了[ -eq 0 ]。这里的问题是-eq操作符被错误地用作只有一个参数(0)的操作符,但它需要两个参数。这就是为什么你会得到一元运算符错误消息。

正如Doktor J在他对这个答案的评论中提到的,避免检查中未设置变量的问题的安全方法是将变量括在""中。详见他的评论。

if [ "$depth" -eq "0" ]; then
echo "false";
exit;
fi

[命令一起使用的未设置变量在bash中显示为空。你可以使用下面的测试来验证这一点,这些测试都为true,因为xyz要么为空,要么未设置:

  • if [ -z ] ; then echo "true"; else echo "false"; fi
  • xyz=""; if [ -z "$xyz" ] ; then echo "true"; else echo "false"; fi
  • unset xyz; if [ -z "$xyz" ] ; then echo "true"; else echo "false"; fi

试一试:

zero=0;


if [[ $depth -eq $zero ]]; then
echo "false";
exit;
fi

双括号(( ... ))用于算术运算。

双方括号[[ ... ]]可用于比较和检查数字(只支持整数),使用以下操作符:

· NUM1 -eq NUM2 returns true if NUM1 and NUM2 are numerically equal.


· NUM1 -ne NUM2 returns true if NUM1 and NUM2 are not numerically equal.


· NUM1 -gt NUM2 returns true if NUM1 is greater than NUM2.


· NUM1 -ge NUM2 returns true if NUM1 is greater than or equal to NUM2.


· NUM1 -lt NUM2 returns true if NUM1 is less than NUM2.


· NUM1 -le NUM2 returns true if NUM1 is less than or equal to NUM2.

例如

if [[ $age > 21 ]] # bad, > is a string comparison operator


if [ $age > 21 ] # bad, > is a redirection operator


if [[ $age -gt 21 ]] # okay, but fails if $age is not numeric


if (( $age > 21 )) # best, $ on age is optional

你可以试试这个:

: ${depth?"Error Message"} ## when your depth variable is not even declared or is unset.

注意:这里它只是?depth之后。

: ${depth:?"Error Message"} ## when your depth variable is declared but is null like: "depth=".

注意:这里是:?depth之后。

在这里,如果变量depth找到null,它将打印错误消息,然后退出。

具体来说:((depth))。通过示例,下面输出1

declare -i x=0
((x)) && echo $x


x=1
((x)) && echo $x

你也可以使用这种格式,使用比较运算符,比如'==' '<='

  if (( $total == 0 )); then
echo "No results for ${1}"
return
fi