Я написал короткий скрипт, который проверяет наличие переменной окружения и завершается ошибкой, если она не существует. Цель этого сценария - использовать его на CI-сервере, на котором переменные конфигурации загружаются через консоль. Я хочу убедиться, что эти переменные были установлены, и провалить задание заранее, если они этого не сделали.
Средой выполнения этих заданий является контейнер Docker на основе Alpine Linux. У меня есть доступ только к sh
. . Я бы хотел избежать установки другой оболочки, например bash
, чтобы размер изображения был как можно меньше.
Сценарий выглядит примерно так:
#!/bin/sh
AWS_ACCESS_KEY_ID=123 # provided by CI
_fail_without() {
VAR_NAME=$1
VAR_VAL=$(eval echo "\$$VAR_NAME")
if [[ -z "${VAR_VAL}" ]]; then
echo "${VAR_NAME} not set; aborting"
exit 1
else
echo "${VAR_NAME} exists"
fi
}
_fail_without AWS_ACCESS_KEY_ID
_fail_without AWS_SECRET_ACCESS_KEY
... с ожидаемым stdout:
AWS_ACCESS_KEY_ID exists
AWS_SECRET_ACCESS_KEY not set; aborting
Как видите, я передал строковое значение имени переменной, а не саму переменную, так что сбои будут правильно регистрироваться. Все это прекрасно работает. Тем не менее, я обеспокоен потенциальными последствиями безопасности для доступа к eval
для доступа к значению переменной в строке VAR_VAL=$(eval echo "\$$VAR_NAME")
.
Вопрос в том: является ли это жизнеспособным подходом, есть ли какие-либо последствия для безопасности, о которых следует знать, и, если есть, есть ли более безопасная или лучшая альтернатива? Я не могу использовать declare
, и printf
, похоже, не ведет себя так же, как в bash
.