217

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

zero=0;

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

不幸的是,这导致:

 [: -eq: unary operator expected

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

请问,如何修改我的脚本以使其正常工作?

4

6 回答 6

233

看起来您的depth变量未设置。这意味着表达式在 bash 将变量的值代入表达式之后[ $depth -eq $zero ]变为。[ -eq 0 ]这里的问题是-eq运算符被错误地用作只有一个参数(零)的运算符,但它需要两个参数。这就是您收到一元运算符错误消息的原因。

编辑:正如Doktor J在他对这个答案的评论中提到的那样,避免检查中未设置变量问题的安全方法是将变量包含在"". 请参阅他的评论以获取解释。

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

与命令一起使用的未设置变量 [对 bash 来说是空的。您可以使用以下测试来验证这一点,这些测试都评估为truexyz或未设置:

  • 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
于 2012-10-26T11:36:09.433 回答
70

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

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

· 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
于 2012-10-26T11:57:28.860 回答
24

尝试:

zero=0;

if [[ $depth -eq $zero ]]; then
  echo "false";
  exit;
fi
于 2012-10-26T11:37:17.983 回答
19

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

  if (( $total == 0 )); then
      echo "No results for ${1}"
      return
  fi
于 2016-09-23T23:14:00.540 回答
6

具体来说:((depth))。例如,以下打印1.

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

x=1
((x)) && echo $x
于 2016-06-10T23:10:54.333 回答
3

你可以试试这个:

: ${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,它将打印错误消息然后退出。

于 2014-07-03T09:53:50.827 回答