Bash 检查环境变量是在 env 变量数组中设置的



我有一个环境变量数组,并希望检查每个env var以确保它们已设置。我正在尝试使用数组 b/c,我将有大约 30 个 env var 来检查。如果我不使用 for 循环而只使用 if 语句,则脚本有效。不幸的是,我不想要 30 个单独的 if 语句。

我这样做的方式是错误的吗?

# my array to store env vars
env_vars=("A" "B" "C")
export A=10
export B=test
export C=
for each in ${env_vars[@]}; do 
echo $each # this works fine
if [ -z "$each" ]; then # this line doesn't seem to work
echo $each;
exit 1
fi
done

bash有一个运算符:-v.(我暂时忽略了环境变量和 shell 变量之间的区别。

for each in "${env_vars[@]}"; do
if ! [[ -v $each ]]; then
echo "$each is not defined"
exit 1
fi
done

您的[ -z "$each" ]只是在测试$each的值(即存储在env_var中的变量的名称(是否为空,这显然不是;它只是被分配了一个名称!您希望查看是否定义了each命名的变量,这就是-v的用途。

不支持-v,您可以使用以下构造:

for each in "${env_vars[@]}"; do
if [ -z "${!each+x}" ]; then
echo "$each is not defined"
exit 1
fi
done
但是,当

它使您的代码更清晰时,有一些重复要说的话。类似的东西

: ${A?A not set}
: ${B?B not set}
: ${C?C not set}

可以在任何 POSIX shell 中工作,并且比需要bash扩展(如间接寻址参数扩展或-v运算符(的循环更直接。

最新更新