簡體   English   中英

如何在 Bash 中設置環境變量數組

[英]How to set an array of environment variables in Bash

我正在嘗試實現一個遷移腳本來導出 bash 中的一些環境變量。

實施起來更難解釋。

基本上,有一組環境變量和一組它們的默認值。

下面報告了(巨大的)遷移腳本的一小部分:

REQUIRED_ENVIRONMENT_VARIABLES=( "BAR" "FOO" "BAZ" )
ENVIRONMENT_VARIABLES_DAFAULT_VALUES=( "/some/path" "0" "true" )

for i in "${!REQUIRED_ENVIRONMENT_VARIABLES[@]}"; do 
    echo "checking environment variable [$i] ${REQUIRED_ENVIRONMENT_VARIABLES[$i]} which default value is: [${ENVIRONMENT_VARIABLES_DAFAULT_VALUES[$i]}]"
    if [[ -z "${REQUIRED_ENVIRONMENT_VARIABLES[$i]}" ]]; then
      echo "variable ${REQUIRED_ENVIRONMENT_VARIABLES[$i]} exported with value ${ENVIRONMENT_VARIABLES_DAFAULT_VALUES[$i]}"
      echo "export ${REQUIRED_ENVIRONMENT_VARIABLES[$i]}"="${ENVIRONMENT_VARIABLES_DAFAULT_VALUES[$i]}" >> $HOME/.bash_profile
    fi
done

簡單地說,for 循環將每個變量迭代到REQUIRED_ENVIRONMENT_VARIABLES中:

  • 如果 var 存在並且具有某些值,則跳過它並繼續下一次迭代;
  • 如果 var 不存在,創建一個新條目export VAR_NAME=DEFAULT_VALUE.bash_profile

因此,例如,如果.bash_profile的原始內容是:

( .bash_profile )

export FOO=1
export ASD=https://cool.url/
...

運行遷移腳本后,結果應該是:

( .bash_profile )

export FOO=1
export ASD=https://cool.url/
...
export BAR=/some/path
export BAZ=true

FOO保持不變,因為已經存在。

此代碼的問題是,當我嘗試使用echo命令將其 append 到.bash_profile時,我看不到任何新條目。 為什么?

問題在測試中

if [[ -z "${REQUIRED_ENVIRONMENT_VARIABLES[$i]}" ]]; then

這擴展了數組的一個元素,然后檢查該數組元素是否是 null 字符串(而不是它是否是變量的名稱)。 也就是說,在i=0的第一次迭代中,它擴展為:

if [[ -z "BAR" ]]; then

...並且由於“BAR”不是 null 字符串,因此測試失敗。 您想要的是將BAR視為變量名,而不是文字字符串。 有幾種方法可以做到這一點。 一種是使用否定的-v測試(“是否有此名稱的變量”)(請注意,這僅在較新版本的 bash 中可用):

if [[ ! -v "${REQUIRED_ENVIRONMENT_VARIABLES[$i]}" ]]; then

另一種選擇是使用 bash 的“間接”變量擴展功能,方法是添加! 在擴展開始時:

if [[ -z "${!REQUIRED_ENVIRONMENT_VARIABLES[$i]}" ]]; then

請注意,這些測試並不完全相同。 第一個會將設置為 null 字符串的變量視為已設置,第二個不會。

順便說一句,這幾乎是“如何檢查 Bash 中是否設置了變量?”的重復。 ,但由於在這種情況下變量名來自一個數組,我認為它的不同足以將其視為一個單獨的問題。

像這樣編碼而不是使用數組會不會更容易:

: ${BAR:=/some/path}
: ${FOO:=0}
: ${BAZ:=true}
: ${POOF:=$((FOO+25))}  # Default for variable depends on other variable
export FOO BAR BAZ POOF

在此源中,如果變量已設置,則它們將保持不變,但如果未設置,則獲取一個值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM