Ваша проблема возникает из-за того, что $i
имеет пустое значение, когда ваше утверждение не выполнено. Всегда заключайте в кавычки ваши переменные при выполнении сравнений, если есть малейшая вероятность того, что одна из них может быть пустой, например ::10000 *
if [ "$i" -ge 2 ] ; then
...
fi
Это из-за того, как оболочка обрабатывает переменные. Предположим, оригинальный пример
if [ $i -ge 2 ] ; then ...
Первое, что делает оболочка при выполнении этой конкретной строки кода, это подставляет значение $i
, как это сделала бы функция search & replace вашего любимого редактора. Итак, предположим, что $i
пусто, или, что еще более наглядно, предположим, что $i
- это группа пробелов! Оболочка заменит $i
следующим образом:
if [ -ge 2 ] ; then ...
Теперь, когда подстановки переменных выполнены, оболочка продолжает сравнение и .... завершается неудачно, потому что не может видеть ничего, что можно понять слева из -gt
. Однако, цитируя $i
:
if [ "$i" -ge 2 ] ; then ...
становится:
if [ " " -ge 2 ] ; then ...
Оболочка теперь видит двойные кавычки и знает, что вы фактически сравниваете четыре пробела с 2 и пропускаете if
.
У вас также есть возможность указать значение по умолчанию для $i
, если $i
пусто, как показано ниже:
if [ "${i:-0}" -ge 2 ] ; then ...
Это заменит значение 0 вместо $i
, если $i
не определено. Я по-прежнему поддерживаю кавычки, потому что, опять же, если $i
- это куча пробелов, то это не считается как undefined , оно не будет заменено на 0, и вы снова столкнетесь с проблемой.
Пожалуйста, прочитайте это , когда у вас есть время. Многие воспринимают оболочку как черный ящик, но работают с очень немногими и очень простыми правилами - как только вы узнаете, что это за правила (одним из них является то, как переменные работают в оболочке, как описано выше), оболочка будет у тебя больше нет секретов.