bash
имеет оператор для этого: -v
.(Я игнорирую различие между переменными окружения и переменными оболочки на данный момент.)
for each in "${env_vars[@]}"; do
if ! [[ -v $each ]]; then
echo "$each is not defined"
exit 1
fi
done
Ваш [ -z "$each" ]
просто проверяет, является ли значение равным $each
(то естьимя переменной, хранящейся в env_var
), является пустым, чего явно нет;это было просто присвоено имя!Вы хотите увидеть, определена ли переменная с именем в each
, для чего -v
.
Без поддержки -v
вы можете использовать следующую конструкцию:
for each in "${env_vars[@]}"; do
if [ -z "${!each+x}" ]; then
echo "$each is not defined"
exit 1
fi
done
Однако, есть кое-что, что нужно сказать о некотором повторении, когда это делает ваш код более понятным.Что-то вроде
: ${A?A not set}
: ${B?B not set}
: ${C?C not set}
будет работать в любой оболочке POSIX и является более простым, чем цикл, требующий расширений bash
, таких как расширение параметра косвенности или оператор -v
.