循环中数组元素的形参展开



我正在检查是否定义了所有的环境变量。

单个元素的测试工作正常,定义如下:

[ -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

最新更新