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

时间:2018-06-08 14:42:04

标签: linux bash shell

我有一系列环境变量,并希望检查每个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

1 个答案:

答案 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运算符更直接。