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

标签 linux bash shell

我有一组环境变量,想检查每个环境变量以确保它们已设置。我正在尝试使用数组 b/c 我将要检查大约 30 个环境变量。如果我不使用 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 中的变量 named 是否已定义,这就是 -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 运算符)的循环更直接。

关于linux - Bash 检查环境变量设置在环境变量数组中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50763087/

相关文章:

linux - 在 'for'循环中,如何通过另一个csv清理csv?

Linux 上的 C : using fclose() on Filepointers made from Socket descriptors

bash - 用于识别彩色控制台输出的 Shell 脚本

linux - 包含当前目录变量的 Bash 别名

java - shell脚本没有完全从java执行

从 shell 脚本执行的命令中的 Mysql 关键字

交叉编译、Crosstool、Makefile、libreadline

C++-Linux : Capturing the mouse ala VirtualBox

linux - 如何使用linux内核和硬件加速绘制三角形?

bash - 无法运行 tar 命令 - 无效选项 -- '▒'