Bash

將數組作為環境變數儲存到非互動式 shell

  • February 26, 2021

有幾個問題可以解決問題,但我想嘗試以下方法:

在這個問題中,我基本上將數組作為環境變數,然後嘗試將字元串儲存到單獨的數組元素中。

a=('Apple Tomato' 'Banana Carrot') bash -c \
'b=($(echo "${a}")); echo -e "${b[0]}\n"; echo "${b[1]}";'

輸出

(Apple

Tomato

期望的輸出:

蘋果番茄

香蕉胡蘿蔔

一個觀察:

此外,如果原始數組在單引號數組元素中包含雙引號,則引號將被保留。例如:a=('Apple "Tomato"' 'Banana "Carrot"')

環境變數是字元串的簡單鍵值對。數組不能是環境變數。

但是,您可以將a數組的值傳遞給bash -c腳本:

bash -c 'printf "%s\n" "$@"' bash "${a[@]}"

或者,如果您想b在腳本中呼叫數組:

bash -c 'b=( "$@" ); printf "%s\n" "${b[@]}"' bash "${a[@]}"

在這兩種情況下,數組的元素a都是在腳本的命令行中傳遞的。這意味著它們將出現在您的腳本中的"$@"(in "$1", "$2", 等) 中。bash -c

您的問題中發生的事情是命令

a=('Apple Tomato' 'Banana Carrot') bash -c '...'

將變數a設置為字元串(Apple Tomato Banana Carrot)。這是腳本中環境變數的值abash -c

$ a=('Apple Tomato' 'Banana Carrot') bash -c 'printf "%s\n" "$a"'
(Apple Tomato Banana Carrot)

如果您確實需要將數據作為環境變數傳遞,您可以通過確定分隔符然後將數組展平為單個字元串來實現。

例如,使用:

IFS=:
b="${a[*]}" bash -c 'set -f; IFS=:; a=( $b ); printf "%s\n" "${a[@]}"'

這將構造字元串並使用此字元串作為腳本的值Apple Tomato:Banana Carrot創建環境變數。b``bash -c

然後該腳本再次拆分b:並將拆分的單詞分配給它自己的a數組。

我需要set -f在腳本中使用,以避免在使用未引用時在拆分的單詞上呼叫文件名萬用字元$b

IFS然後,您還希望在父 shell 和父 shell 中恢復原始值bash -c(您可能希望將舊值儲存在變數中以使其更容易)。您可能還想在bash -c腳本中再次啟用文件名萬用字元,使用set +f.

ifs=$IFS; IFS=:
b="${a[*]}" bash -c 'set -f; ifs=$IFS; IFS=:; a=( $b ); IFS=$ifs; unset ifs; set +f; printf "%s\n" "${a[@]}"'
IFS=$ifs; unset ifs

引用自:https://unix.stackexchange.com/questions/636541