Просмотр страницы BASH на set -e
:
Выйти немедленно, если простая команда (см. ОБРАЗЕЦ ОБОЛОЧКИ выше) завершается с ненулевым статусом. [...]
Таким образом, если какой-либо оператор возвращает ненулевой код выхода, оболочка завершит работу.
Посмотрите на справочную страницу BASH , на команду let
:
Если последний аргумент оценивается как 0, пусть возвращает 1; В противном случае возвращается 0.
Но подождите! Ответ на i++
- один, а не ноль! Это должно было сработать!
Опять же, ответом является справочная страница BASH в операторе приращения:
id ++ id--: переменная после увеличения и после уменьшения
Хорошо, не так ясно. Попробуйте этот сценарий оболочки:
#!/bin/bash
set -e -v
i=1; let ++i; echo "I am still here"
i=0; let ++i; echo "I am still here"
i=0; ((++i)); echo "I am still here"
Хммм ... это работает как ожидалось, и все, что я сделал, это изменил i++
на ++i
в каждой строке.
i++
- это оператор после увеличения . Это означает, что он увеличивается i
после того, как оператор let
возвращает значение. Поскольку i
равнялся нулю до увеличения , оператор let
возвращает ненулевое значение.
Однако ++i
является оператором предварительного увеличения . Это означает, что он увеличивает i
перед возвратом состояния выхода. Поскольку i
увеличивается до 1
, состояние выхода становится равным нулю.
Надеюсь, это имеет смысл.