如何使用Bash遍历数组以检查列表环境变量?

我有一个bash脚本,该脚本运行检查以确定执行逻辑之前是否已设置必需的环境变量。

此刻,我为每个环境变量重复以下代码块:

if [[ -z "$SOME_ENV_VAR" ]]; then
    echo "Warning - the SOME_ENV_VAR environment variable isn't set"

    exit 1
fi

有没有办法声明一个数组并遍历该数组并检查是否设置了环境变量?

我知道如何遍历bash中的数组,但是我不确定如何使用每个迭代变量来 检查是否存在类似名称的环境变量。

ptpstao 回答:如何使用Bash遍历数组以检查列表环境变量?

如果该名称存储在另一个变量中,则可以使用 indirection 通过其名称访问变量。一个小例子:

x=1
name=x
echo "${!name}" # prints 1

使用这种方法,您只需要遍历要检查的变量的名称:

for name in FIRST_ENV_VAR SECOND_ENV_VAR ...; do
    if [[ -z "${!name}" ]]; then
        echo "Variable $name not set!"
        exit 1
    fi
done

您可能还想使用-z "${!name+x}"接受设置为空字符串的变量,请参见here

,
x=(
  LANG
  LC_MEASUREMENT
  LC_PAPER
  LC_MONETARY
  LC_NAME
  LC_ADDRESS
  LC_NUMERIC
  LC_TELEPHONE
  LC_IDENTIFICATION
  LC_TIME
)
for v in "${x[@]}"; do
  echo "$v = \"${!v}\""
done

结果:

LANG = "en_US.UTF-8"
LC_MEASUREMENT = "en_US.UTF-8"
LC_PAPER = "en_US.UTF-8"
LC_MONETARY = "en_US.UTF-8"
LC_NAME = "en_US.UTF-8"
LC_ADDRESS = "en_US.UTF-8"
LC_NUMERIC = "en_US.UTF-8"
LC_TELEPHONE = "en_US.UTF-8"
LC_IDENTIFICATION = "en_US.UTF-8"
LC_TIME = "en_US.UTF-8"

有关使用bash 名称 ${!进行间接扩展的说明,请参见}(1)manual page

,

您可以按照ENV_VAR_ARR的方式创建要迭代的环境变量的列表。
然后使用for循环遍历每个变量。

for循环将获取列表中的每个项目,将其分配给SOME_ENV_VAR并执行do和done之间的命令,然后返回顶部,获取列表中的下一个项目,然后重复执行。

列表定义为一系列字符串,用空格分隔。

#!/bin/bash

ENV_VAR_ARR='ENV_1 ENV_2 ENV_3'

for SOME_ENV_VAR in $ENV_VAR_ARR
do
    echo $SOME_ENV_VAR
    if [[ -z "${!SOME_ENV_VAR}" ]]; then
        echo "Warning - the $SOME_ENV_VAR environment variable isn't set"
        exit 1
    fi
done
本文链接:https://www.f2er.com/3125189.html

大家都在问