Ваша часть сценария просто работает отлично. Вы уверены, что не присваиваете ничто больше перед если к "i"?
частая ошибка А не состоит в том, чтобы также оставить пространство после и перед квадратными скобками.
Оценка из сообщения об ошибке значение я был пустой строкой, когда Вы выполнили его, не 0.
Ваша проблема является результатом того, которое $i
имеет пустое значение, когда Ваш оператор перестал работать. Всегда кавычка Ваши переменные при выполнении сравнений, если существует малейший шанс, что один из них может быть пустым, например:
if [ "$i" -ge 2 ] ; then
...
fi
Это из-за того, как оболочка рассматривает переменные. Примите исходный пример,
if [ $i -ge 2 ] ; then ...
первая вещь, которую оболочка делает при выполнении, что конкретная строка кода является заменой значение $i
, точно так же, как любимый редактор поиск & замена функция была бы. Поэтому предположите, что $i
пусто или, еще более иллюстративен, предположите, что $i
набор пробелов! Оболочка заменит $i
следующим образом:
if [ -ge 2 ] ; then ...
Теперь, когда подстановки переменных сделаны, доходы оболочки со сравнением и.... перестали работать, потому что оно не видит, что-либо понятное уехало из [1 111]. Однако заключение в кавычки $i
:
if [ "$i" -ge 2 ] ; then ...
становится:
if [ " " -ge 2 ] ; then ...
оболочка теперь видит двойные кавычки и знает, что Вы на самом деле сравниваете четыре пробела с 2 и пропустите if
.
у Вас также есть опция определения значения по умолчанию для [1 114], если $i
пробел, следующим образом:
if [ "${i:-0}" -ge 2 ] ; then ...
Это займет место, значение 0 вместо [1 116] $i
, не определено. Я все еще поддерживаю кавычки, потому что, снова, если $i
набор пробелов тогда, он не рассчитывает как [1 122] неопределенный , он не будет заменен 0, и Вы столкнетесь с проблемой еще раз.
читайте это , когда у Вас будет время. Оболочку рассматривают как черный квадрат многие, но она работает с очень немногими и очень простыми правилами - как только Вы знаете о том, что те правила (один из них являющийся, как работа переменных в оболочке, как объяснено выше), оболочка больше не будет иметь секретов для Вас.