Bash scripting - проверьте, равна ли переменная bash 0

У меня есть глубина переменной bash, и я бы хотел проверить, равен ли он 0. Если да, я хочу прекратить выполнение script. До сих пор я:

zero=0;

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

К сожалению, это приводит к:

 [: -eq: unary operator expected

(может быть немного неточным из-за перевода)

Пожалуйста, как я могу изменить свой script, чтобы он работал?

Ответ 1

Похоже, ваша переменная depth не установлена. Это означает, что выражение [ $depth -eq $zero ] становится [ -eq 0 ] после того, как bash заменяет значения переменных в выражение. Проблема здесь в том, что оператор -eq неправильно используется как оператор с одним аргументом (ноль), но для этого требуются два аргумента. Вот почему вы получаете сообщение об ошибке унарного оператора.

EDIT: Как 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

Ответ 2

Для арифметических операций используется двойная скобка (( ... )).

Двойные квадратные скобки [[ ... ]] могут использоваться для сравнения и анализа чисел (поддерживаются только целые числа) со следующими операторами:

· 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

Ответ 3

Попробуйте:

zero=0;

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

Ответ 4

вы также можете использовать этот формат и использовать операторы сравнения, такие как '==' '< ='

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

Ответ 5

Вы можете попробовать следующее:

: ${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, она выведет сообщение об ошибке и выйдет.

Ответ 6

В частности: ((depth)). Например, следующие отпечатки 1.

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

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