Я учусь тому, как эффективно использовать различные set
опции в моем скрипте, и наткнулся на set -u
то, что кажется идеальным для выхода из моего скрипта, если переменная не установлена должным образом (например, удаление пользователей). Согласно справочной странице, set -u
и set -e
делает следующее ...
-e Exit immediately if a command exits with a non-zero status.
-u Treat unset variables as an error when substituting.
Я создал тестовый скрипт для проверки этой функциональности, но он не работает должным образом. Возможно, кто-то мог бы лучше объяснить мою проблему мне и где я неправильно интерпретирую? Тестовый скрипт ниже. Спасибо.
set -e
set -u
testing="This works"
echo $?
echo ${testing}
testing2=
echo $?
echo ${testing2}
testing3="This should not appear"
echo $?
echo ${testing3}
Я ожидаю, что скрипт отобразит 0 и «Это работает» , а затем потерпит неудачу, так как ${testing2}
не установлен.
Вместо этого у меня отображается 0 и «Это работает» , затем 0 и затем 0 Это не должно появляться
Кто-нибудь может дать некоторые знания? Спасибо.
источник
Ответы:
Из "Человек Баш":
Когда вы это делаете,
testing2=
вы устанавливаете переменную в нулевую строку.Измените это на
unset testing2
и попробуйте снова.set -e
Не помогает в этом случае назначение не имеет код выхода 1. Попробуйте это , чтобы увидеть , что последняя команда выполняется (присвоение) имеет код завершения 0, или прочитать этот вопрос :И я также считаю, что использование set -e - это скорее проблема, чем решение.
Что может привести к ошибке при использовании неустановленных переменных
set -u
:Будет выводить:
источник
testing2=
устанавливаетtesting2
переменную в пустую строку; переменная на самом деле установлена .Однако, если бы вы работали
echo $testing99
в интерактивной оболочке Bash (без настройкиerrexit
, т. Е.set -e
), Вы получите ошибку:В сторону
Во время тестирования сценариев я обнаружил, что интерактивная оболочка не всегда завершается при попытке развернуть переменную, которая не была установлена, в то время как неинтерактивная оболочка (запускающая сценарий оболочки) всегда завершается . Согласно справочной странице POSIX для
set
:Интерактивное Bash оболочки не будет выходить , если
errexit
не имеет также установлен. С другой стороны, интерактивная панель инструментов не выйдет, даже еслиset -e
она уже была запущена.источник