為什麼此語法不適用於聲明關聯數組

為什麼此語法不適用於聲明關聯數組

我可以在 () 語法中使用變數嗎

#!/bin/bash
declare -A c
declare -A b
a="[a]=0 [b]=1 [c]=2 [d]=3"
b=($a) # or b=($(echo "$a"))
echo "***********${b[@]}*********"  #********************

c=([a]=0 [b]=1 [c]=2 [d]=3)
echo "---------${c[@]}----------"  #---------0 1 2 3----------

答案1

目前(據我所知)不可能在 Bash 中獲取字串並用它們創建關聯數組。因此,您必須在使用該語句之前「評估」它們eval

當我運行你的範例時,我使用 Bash 版本 4.1.7 得到以下資訊:

$ ./arr.bash 
./arr.bash: line 5: b: [a]=0: must use subscript when assigning associative array
./arr.bash: line 5: b: [b]=1: must use subscript when assigning associative array
./arr.bash: line 5: b: [c]=2: must use subscript when assigning associative array
./arr.bash: line 5: b: [d]=3: must use subscript when assigning associative array

將此行更改為有效:

eval "b=($a)" # or b=($(echo "$a"))

重新運行你現在得到了預期的結果:

$ ./arr.bash 
***********0 1 2 3*********
---------0 1 2 3----------

解釋

我發現這個問答題為:Bash:如何將關聯數組分配給另一個變數名稱(例如重新命名變數)?,它說明了一種執行此操作的方法declare,但它表明該方法實際上是多麼不可讀,並且可能不應該使用。

# declare associative array
declare -A assoc_array=(["key1"]="value1" ["key2"]="value2")
# convert associative array to string
assoc_array_string=$(declare -p assoc_array)
# create new associative array from string
eval "declare -A new_assoc_array="${assoc_array_string#*=}
# show array definition
declare -p new_assoc_array

此方法顯示$assoc_array轉換為字串,然後轉換回關聯數組$new_assoc_array。但即使這樣的方法也逃不掉使用的需要eval。這是一個很難理解的程式碼片段,它說明了為什麼應該避免它。

答案2

你需要

eval "b=($a)"

eval在執行參數擴展後將其參數評估為 shell 命令。但請小心使用。確保$a不是由使用者輸入設定的,因為這可能會導致各種麻煩。

相關內容