2013-12-18 4 views
0

Я проверяю, установлены ли переменные среды.Как передать переменную в расширение параметра?

Это дает мне именно то, что я хочу в единственном числе:

: ${API_KEY:?`echo "Need to set API_KEY"`} 

Однако, когда я извлечь функцию для цикла по набору переменных, вещи не работают, как я ожидал.

function check_env_for { 
    : ${$1:?`echo "Need to set $1 non-empty"`} 
} 
check_env_for API_KEY 

брейки, возвращающие:

-bash: ${$1:?`echo "Need to set $1 non-empty"`}: bad substitution 

Хотя решение оценили то, что ядро ​​оболочки основы я, вероятно, не хватает?

ответ

0

Я получил это работает со следующим кодом, который можно изменить в соответствии с вашими потребностями:

function check_env_for { 
    KEY="$(eval echo \$$1)" 
    echo ${KEY:-"Need to set $1 non-empty"} 
} 
check_env_for API_KEY 

Здесь в одной строке:

function check_env_for { 
    echo ${$(eval echo \$$1):-"Need to set $1 non-empty"} 
} 

Это возвращает либо значение $API_KEY или Need to set API_KEY non-empty

+0

Это не отражает ничего, независимо от того, существует ли параметр как переменная. – Matthew

+0

Не используйте 'eval' для повторного реализации расширения косвенных параметров. – chepner

+0

«eval» необходим для получения значения переменной ENV в этом контексте. Это то, за что «eval». – Donovan

1

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

function check_env_for { 
    local foo="$1" 
    : ${!foo:?"Need to set $foo non-empty"} 
} 

Однако, обратите внимание, что сообщение об ошибке не является идеальным:

$ check_env_for FOO 
bash: !foo: Need to set FOO non-empty 

С вы пишете функцию, это, вероятно, понятнее пропустить расширение параметра «Display Error» и просто тест на непустую строку, снова используя косвенное расширение параметра:

check_env_for() { 
    [[ -z ${!1} ]] && printf "Need to set $1 non-empty\n" 
} 
+0

Это вызывает ошибку локально. 'check_env_for: 1: bad substitution' – Donovan

+0

Вы уверены, что используете' bash'? Работает для меня в 3.2.51 – chepner

0

Usi ng ${parameter:?word} Расширение делает трюк, но результат выглядит неприятным. Использование расширения ${parameter:-word} выглядит лучше.

Если вы все еще предпочитаете первый, ваш код должен выглядеть так.

#!/bin/bash 
function check_env_for { 
     eval : \${$1:?"Need to set $1 non-empty"} 
} 
check_env_for API_KEY 

Дайте это попробовать и посмотреть, нравится ли вам это.

#!/bin/bash 
function check_env_for { 
     eval echo \${$1:-"Need to set $1 non-empty"} 
} 
check_env_for API_KEY 

eval как в коде будет оценивать $1 и расширить его API_KEY. $ вне {} экранирован, поэтому он не будет расширен на eval.

Смежные вопросы