[英]How to iterate over array to check list environment variables using Bash?
我有一個 bash 腳本,它運行檢查以確定在執行其邏輯之前是否設置了必要的環境變量。
目前,我正在為每個環境變量重復以下代碼塊:
if [[ -z "$SOME_ENV_VAR" ]]; then
echo "Warning - the SOME_ENV_VAR environment variable isn't set"
exit 1
fi
有沒有辦法聲明一個數組並遍歷數組並檢查是否設置了環境變量?
我知道如何在 bash 中迭代 arrays,但我不確定如何使用每個迭代變量來檢查是否存在類似命名的環境變量。
如果該名稱存儲在另一個變量中,您可以使用間接方式通過變量名稱訪問該變量。 一個小例子:
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}"
來接受設置為空字符串的變量,請參見此處。
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) 手冊頁,了解使用${!
名稱}
。
declare -a MY_ENVS
# Set the above array with whatever
# env variables you want to check
# e.g.,
MY_ENVS+=( "HOME" )
遍歷所有這些,
for env_var in "${MY_ENVS[@]}"
do
if [ -z "${env_var}" ]
then
echo "${env_var} not set"
fi
done
或者,如果您想存儲與特定環境變量相對應的值,請使用關聯 arrays:
declare -A ENV_VARS_A
ENV_VARS_A["HOME"]="some val"
迭代:
for env_var in "${!ENV_VARS_A[@]}"
do
# env_var is key
:
done
您可以創建要迭代的環境變量列表,如ENV_VAR_ARR
中所做的那樣。
然后使用for
循環遍歷它們中的每一個。
for 循環將獲取列表中的每個項目,為其分配SOME_ENV_VAR
並執行 do 和 done 之間的命令,然后 go 回到頂部,獲取列表中的下一個項目並重復。
該列表定義為一系列字符串,以空格分隔。
#!/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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.