Следующий код дает
[: -ge: ожидается унарный оператор
когда
i=0
if [ $i -ge 2 ]
then
#some code
fi
Зачем?
Ваша проблема возникает из-за того, что у вас $i
есть пустое значение, когда ваша инструкция терпит неудачу. Всегда указывайте свои переменные при сравнении, если есть малейшая вероятность, что одна из них может быть пустой, например:
if [ "$i" -ge 2 ] ; then
...
fi
Это связано с тем, как оболочка обрабатывает переменные. Предположим исходный пример,
if [ $i -ge 2 ] ; then ...
Первое, что делает оболочка при выполнении этой конкретной строки кода, - это подставляет значение $i
, как это сделала бы функция поиска и замены вашего любимого редактора . Итак, предположим, что $i
это пусто, или, что еще более наглядно, предположим, что $i
это куча пробелов! Оболочка заменит $i
следующим образом:
if [ -ge 2 ] ; then ...
Теперь, когда подстановки переменных выполнены, оболочка продолжает сравнение и ... терпит неудачу, потому что не видит ничего понятного слева от -gt
. Однако цитируя $i
:
if [ "$i" -ge 2 ] ; then ...
становится:
if [ " " -ge 2 ] ; then ...
Теперь оболочка видит двойные кавычки и знает, что вы на самом деле сравниваете четыре пробела с двумя и пропускаете if
.
У вас также есть возможность указать значение по умолчанию для $i
if $i
is blank, как показано ниже:
if [ "${i:-0}" -ge 2 ] ; then ...
Это будет подставить значение 0 вместо того , чтобы $i
это $i
не определено. Я все еще сохраняю кавычки, потому что, опять же, если $i
это куча пробелов, то они не считаются неопределенными , они не будут заменены на 0, и вы снова столкнетесь с проблемой.
Пожалуйста, прочтите это, когда у вас будет время. Многие рассматривают оболочку как черный ящик, но она работает с очень немногими и очень простыми правилами - как только вы узнаете, что это за правила (одно из них заключается в том, как переменные работают в оболочке, как описано выше), оболочка будет у тебя больше нет секретов.
Судя по сообщению об ошибке, значение i было пустой строкой, когда вы ее выполнили, а не 0.
источник
Мне нужно добавить свои 5 центов. Я вижу, что все используют
[
или[[
, но стоит отметить, что они не являются частью синтаксиса if.((...))
Вместо этого используйте для арифметических сравнений .источник
Ваш сценарий отлично работает. Вы уверены, что не назначаете что-либо еще до «i»?
Распространенной ошибкой также является не оставлять пробелов после квадратных скобок и перед ними.
источник