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