Как перебрать массив для проверки списка переменных среды с помощью Bash? - PullRequest
0 голосов
/ 11 ноября 2019

У меня есть скрипт bash, который запускает проверку, чтобы определить, установлены ли необходимые переменные среды перед выполнением его логики.

В настоящий момент я повторяю следующий блок кода для каждой переменной среды:

if [[ -z "$SOME_ENV_VAR" ]]; then
    echo "Warning - the SOME_ENV_VAR environment variable isn't set"

    exit 1
fi

Есть ли способ объявить массив и выполнить итерации по массиву и проверить, установлена ​​ли переменная окружения?

Я знаю, как перебирать массивы в bash, но я неубедитесь, как использовать каждую переменную итерации для проверки наличия переменной среды с аналогичным именем.

Ответы [ 3 ]

2 голосов
/ 11 ноября 2019

Вы можете использовать косвенное указание для доступа к переменной по ее имени, если это имя хранится в другой переменной. Небольшой пример:

x=1
name=x
echo "${!name}" # prints 1

При таком подходе вам нужно только перебирать имена переменных, которые вы хотите проверить:

for name in FIRST_ENV_VAR SECOND_ENV_VAR ...; do
    if [[ -z "${!name}" ]]; then
        echo "Variable $name not set!"
        exit 1
    fi
done

Вы также можете использовать -z "${!name+x}" чтобы принять переменные, которые установлены в пустую строку, смотрите здесь .

1 голос
/ 11 ноября 2019
x=(
  LANG
  LC_MEASUREMENT
  LC_PAPER
  LC_MONETARY
  LC_NAME
  LC_ADDRESS
  LC_NUMERIC
  LC_TELEPHONE
  LC_IDENTIFICATION
  LC_TIME
)
for v in "${x[@]}"; do
  echo "$v = \"${!v}\""
done

Результат:

LANG = "en_US.UTF-8"
LC_MEASUREMENT = "en_US.UTF-8"
LC_PAPER = "en_US.UTF-8"
LC_MONETARY = "en_US.UTF-8"
LC_NAME = "en_US.UTF-8"
LC_ADDRESS = "en_US.UTF-8"
LC_NUMERIC = "en_US.UTF-8"
LC_TELEPHONE = "en_US.UTF-8"
LC_IDENTIFICATION = "en_US.UTF-8"
LC_TIME = "en_US.UTF-8"

См. Страницу руководства bash (1) для объяснения косвенного расширения с использованием ${! name }.

0 голосов
/ 11 ноября 2019

Вы можете создать список переменных среды, для которых вы хотите выполнить итерацию, как в ENV_VAR_ARR.
Затем выполнить итерацию по каждой из них, используя цикл for.

Цикл for возьмет каждый элемент в списке, назначит его SOME_ENV_VAR и выполнит команды между do и done, затем вернется к вершине, возьмет следующий элемент в списке и повторит.

Список определяется как последовательность строк, разделенных пробелами.

#!/bin/bash

ENV_VAR_ARR='ENV_1 ENV_2 ENV_3'

for SOME_ENV_VAR in $ENV_VAR_ARR
do
    echo $SOME_ENV_VAR
    if [[ -z "${!SOME_ENV_VAR}" ]]; then
        echo "Warning - the $SOME_ENV_VAR environment variable isn't set"
        exit 1
    fi
done
...