我正在检查是否设置了环境变量。
这给了我我想要的单数:
: ${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基础?
答案 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_KEY
或Need 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
上展开。