我有一系列环境变量,并希望检查每个env var以确保它们已设置。我正在尝试使用数组b / c我将有大约30个env vars来检查。如果我不使用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
答案 0 :(得分:3)
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
运算符更直接。