我有一个环境变量数组,并希望检查每个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
运算符(的循环更直接。