我正在检查是否定义了所有的环境变量。
单个元素的测试工作正常,定义如下:
[ -z ${env_var1:+y} ] && echo "Env var not defined."
虽然我需要为多个元素检查这个,因此我想把它添加到循环中。但是不知道为什么它不工作:
env_var_array=( env_var1 env_var2 env_var3 )
for element in "${env_var_array[@]}"
do
[ -z ${element:+y} ] && echo "$element var not defined."
done
没有按预期工作。
要使用变量名,请使用${!element}
:
#!/bin/bash
env_var_array=( env_var1 env_var2 env_var3 )
for element in "${env_var_array[@]}"
do
[ -z "${!element:+y}" ] && echo "$element var not defined."
done
env_var1 var not defined.
env_var2 var not defined.
env_var3 var not defined.
关于:+y
部分:
${parameter:+word}
如果parameter为null或未设置,则不替换任何内容,否则替换字的展开部分。(文档)
在您的情况下不需要这些,因此您可以将其简化为[ -z ${!element} ]
如果您只想检查是否设置了所有环境变量,则无需像这样的循环即可完成:
if declare -p "${env_var_array[@]}" >/dev/null 2>&1; then
printf 'All of these variables are defined: %sn' "${env_var_array[*]}"
fi