Переменные окружения проверки Bash установлены в массиве переменных env - PullRequest
0 голосов
/ 08 июня 2018

У меня есть массив переменных окружения, и я хочу проверить каждую переменную env, чтобы убедиться, что они установлены.Я пытаюсь использовать массив b / c. У меня будет около 30 переменных для проверки.Если я не использую цикл for и только оператор if, скрипт работает.К сожалению, я не хочу 30 отдельных операторов if.

Я поступаю неправильно?

# my array to store env vars
env_vars=("A" "B" "C")

export A=10
export B=test
export C=

for each in ${env_vars[@]}; do 
    echo $each # this works fine
    if [ -z "$each" ]; then # this line doesn't seem to work
        echo $each;
        exit 1
    fi
done

1 Ответ

0 голосов
/ 08 июня 2018

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...