Запрет жесткого кодирования условия if в bash - PullRequest
0 голосов
/ 03 февраля 2020

Ниже приведен мой пример кода, который устанавливает параметры среды для сеанса. Я получаю имя параметра env в качестве первого аргумента функции и сохраняю его в supplied_env, у меня есть список возможных сред, которые содержат возможные или разрешенные среды, разрешенные для этого сценария. Я должен держать этот список жестко закодированным, что приемлемо. Однако, в конце, перед получением файла среды, мне нужно запустить if condition с жестко закодированным именем среды (env1 or env2). Есть ли способ сохранить только жестко закодированные имена окружений только в начале и динамически сопоставить их позже?

#!/bin/bash
supplied_env="${1}"
possible_env="env1 env2"

if [ $# -ne 1 ];then
    echo "You must provide any one of these values ${possible_env}"
    exit 1;
elif ! echo "${possible_env}"|grep "$supplied_env" ;then
    echo "Incorrect value provided, You must provide any one of these values ${possible_env}"
    exit 2;
else
    target_env=${supplied_env}
fi

if [ ${supplied_env} == "env1" ];then  #<------How to avoid using `env1` string here, rather get it from possible_env ?
        source ~/.env1
elif [ ${supplied_env} == "env2" ];then
        source ~/.env2
else
   echo "Error..."
fi

Короче говоря, в будущем появятся среды перемещения, такие как env3, env4 et c. Я просто хочу обновить скрипт в одном месте, а не в нескольких.

Ответы [ 2 ]

3 голосов
/ 03 февраля 2020
if [ ${supplied_env} == "env1" ];then  #<------How to avoid using `env1` string here, rather get it from possible_env ?
        source ~/.env1
elif [ ${supplied_env} == "env2" ];then
        source ~/.env2
else
   echo "Error..."
fi

Вы можете заменить $supplied_env в операторе source. Так как вы уже сделали проверку ошибок, вам не нужны никакие другие логи c, только один source вызов.

source ~/."$supplied_env"
2 голосов
/ 03 февраля 2020

Сохранение разрешенных имен в качестве ключей в ассоциативном массиве.

declare -A possible_env=([env1]=~/.env1 [env2]=~/.env2)

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

supplied_env="${1:?Must supply an environment name}"
declare -A possible_env=([env1]=~/.env1 [env2]=~/.env2)

if [[ ! -v possible_env[$suppliedEnv] ]]; then
  echo "Incorrect value provided, You must provide any one of these values: ${!possible_env[*]}"
  exit 2;
fi

source "${possible_env[$suppliedEnv]"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...