Проверка наличия bash переменных окружения с помощью функции - PullRequest
2 голосов
/ 12 марта 2020

На этот вопрос можно было ответить и в других сообщениях SO, но я не думаю, что могу найти именно то, что ищу.

У меня есть функция (#!/usr/bin/env bash), которая проверяет существование (окружающая среда) переменная

checkForVariable() {
  if [[ -z $1 ]]; then
    echo "Error: Define $1 environment variable"
    exit 1
  fi
}

но в сообщении об ошибке я хочу сообщить мне , какая переменная env отсутствует.

Если я вызываю ее, используя checkForVariable "${ENVIRONMENT_NAME}"

и если ENVIRONMENT_NAME не установлено, то, очевидно, я получу Error: Define environment variable, что бесполезно.

Как я могу изменить свою функцию, чтобы я мог передать checkForVariable строку, а не ссылку на переменную, т.е.

checkForVariable "ENVIRONMENT_NAME"

Я пробовал, например. if [[ -z "\$${1}" ]]; then и if [[ -z "${$1}" ]]; then, но они не работают.

Ответы [ 3 ]

3 голосов
/ 12 марта 2020

Вы можете использовать -v и отрицать его, используя ! и тест для атрибута -x вместо -z

checkForVariable() {
  local env_var=
  env_var=$(declare -p "$1")
  if !  [[ -v $1 && $env_var =~ ^declare\ -x ]]; then
    echo "Error: Define $1 environment variable"
    exit 1
  fi
}

Затем вы можете выполнить тестирование внутри скрипт.

checkForVariable ENVIRONMENT_NAME

Это согласно справочному тесту.

help test | grep -- '^[[:space:]]*-v'

Вывод

-v VAR         True if the shell variable VAR is set.

А также !

help test | grep -- '^[[:space:]]*!'

Вывод

! EXPR         True if expr is false.

Также для переменных env, как указал chepner, необходимо искать атрибут -x, проверяя вывод declare -p ENV_NAME

help declare | grep -- '^[[:space:]]*-x'

Вывод

-x        to make NAMEs export

Хотя вышеприведенное работает, если вы тестируете переменную внутри самого скрипта, а не в интерактивной оболочке. Теперь, если вы хотите сделать это в интерактивном сеансе, тогда для его работы необходим источник файла / скрипта.

Поместите это в ваш dotfiles / rcfiles, как в ~/.profile или ~/.bash_profile или ~/.bashrc

checkForVariable() {
  local env_var=
  env_var=$(declare -p "$1")
   if ! [[  -v $1 && $env_var =~ ^declare\ -x ]]; then
     echo "Error: Define $1 environment variable"
     return 1
   fi
 }

Просто нужно заменить exit на return, иначе ваш интерактивный сеанс завершится немедленно.

А затем отправьте этот rcfile.

source ~/.profile 

Предполагая, что ~/.profile находится там, где находится эта функция.

Вы можете выполнить тест во время интерактивного сеанса.

checkForVariable ENVIRONMENT_NAME

РЕДАКТИРОВАТЬ: Как указал chepner, я добавил тест для атрибута -x.

1 голос
/ 12 марта 2020

Вы можете использовать эту функцию:

checkForVariable() {
    if [[ -z ${!1+set} ]]; then
       echo "Error: Define $1 environment variable"
       exit 1
    fi
}

Затем используйте ее как:

checkForVariable ENVIRONMENT_NAME

Обратите внимание, что ${!1+set} переменная разыменования, используя заданное имя в $1 для вашей функции и :+set проверка необходима для проверки переменных env, установленных на пустое значение.

Code Demo

0 голосов
/ 12 марта 2020

Поскольку у вас есть env в вашем shebang, вы можете сделать:

printenv | grep "^ENV_VARIABLE"

или можете использовать set:

set | grep -E "^ENV_VARIABLE=.+$"

А также python oneliners:

python3 -c 'import os; import sys; print(bool(os.getenv(sys.argv[1])))'  HOME

Вы можете проверить результат печати другим способом, конечно:

[ ! -z `printenv VAR` ] || echo "VAR not exists"

Таким образом, ваша функция станет

function checkEnv() { [ ! -z `printenv $1` ] || echo "$1 Error message.."; }
...