Bash
將數組作為環境變數儲存到非互動式 shell
有幾個問題可以解決問題,但我想嘗試以下方法:
在這個問題中,我基本上將數組作為環境變數,然後嘗試將字元串儲存到單獨的數組元素中。
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)
。這是腳本中環境變數的值a
:bash -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