如何将变量传递给参数扩展?

时间:2013-12-18 16:30:22

标签: bash shell environment-variables

我正在检查是否设置了环境变量。

这给了我我想要的单数:

 : ${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

虽然我们很感激解决方案,但我可能缺少哪些核心shell基础?

3 个答案:

答案 0 :(得分: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

由于您正在编写函数,因此可以更清楚地跳过“显示错误”参数扩展并仅使用间接参数扩展测试非空字符串:

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

答案 1 :(得分: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_KEYNeed to set API_KEY non-empty

的值

答案 2 :(得分:0)

使用${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上展开。