如何在Bash中重命名关联数组?

Dav*_*rks 16 variables bash associative-array

我需要循环一个关联数组并将其内容排放到临时数组(并对该值执行一些更新).

然后应该丢弃第一个数组的剩余内容,并且我想将temp数组分配给原始数组变量.

Sudo代码:

declare -A MAINARRAY
declare -A TEMPARRAY
... populate ${MAINARRAY[...]} ...

while something; do     #Drain some values from MAINARRAY to TEMPARRAY
    ${TEMPARRAY["$name"]}=((${MAINARRAY["$name"]} + $somevalue))
done
... other manipulations to TEMPARRAY ...

unset MAINARRAY        #discard left over values that had no update
declare -A MAINARRAY
MAINARRAY=${TEMPARRAY[@]}  #assign updated TEMPARRAY back to MAINARRAY (ERROR HERE)
Run Code Online (Sandbox Code Playgroud)

Flo*_*aus 25

在bash中不能直接复制关联数组.正如已经指出的那样,最佳解决方案可能是迭代遍历数组并逐步复制它.

我用另一种解决方案将变量传递给函数.您可以使用相同的技术来复制关联数组:

# 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
Run Code Online (Sandbox Code Playgroud)

  • “eval”是必要的,因为它声明了新数组。问题是,声明 -A 期望赋值中的语句而不是字符串。因此,您需要创建一个字符串并将其作为语句进行计算。 (2认同)

gle*_*man 12

使用关联数组,我不相信除了迭代之外还有其他任何方法

for key in "${!TEMPARRAY[@]}"  # make sure you include the quotes there
do
  MAINARRAY["$key"]="${TEMPARRAY["$key"]}"
  # or: MAINARRAY+=( ["$key"]="${TEMPARRAY["$key"]}" )
done
Run Code Online (Sandbox Code Playgroud)


小智 7

这个单行做一个关联数组副本:MAINARRAY = TEMPARRAY

eval $(typeset -A -p TEMPARRAY|sed 's/ TEMPARRAY=/ MAINARRAY=/')
Run Code Online (Sandbox Code Playgroud)


小智 7

这是任何类型的 bash 变量的小型复制函数
- 普通标量变量
- 索引数组
- 关联数组

### Function vcp    -VariableCoPy-  
# $1 Name of existing Source-Variable  
# $2 Name for the Copy-Target  
vcp() {
    local var=$(declare -p $1)
    var=${var/declare /declare -g }
    eval "${var/$1=/$2=}"
}
Run Code Online (Sandbox Code Playgroud)

用法,示例:

# declarations
var="  345  89  "
ind_array=(Betty "  345  89  ")
declare -A asso_array=([one]=Harry [two]=Betty [some_signs]=" +*.<\$~,'/ ")  

# produce the copy
vcp var varcopy
vcp ind_array ind_array_copied
vcp asso_array asso_array_2   

# now you can check the equality between original and copy with commands like
# declare -p <name>
Run Code Online (Sandbox Code Playgroud)

结果

--3    1: "${asso_array[@]}"   
(5)       asso_array[one]:        |Harry|   
(11)      asso_array[some_signs]: | +*.<$~,'/ |   
(5)       asso_array[two]:        |Betty|   
--3    4: "${asso_array_2[@]}"   
(5)       asso_array_2[one]:        |Harry|   
(11)      asso_array_2[some_signs]: | +*.<$~,'/ |   
(5)       asso_array_2[two]:        |Betty|   
--2    7: "${ind_array[@]}"   
(5)       ind_array[0]:   |Betty|   
(11)      ind_array[1]:   |  345  89  |   
--2    9: "${ind_array_copied[@]}"   
(5)       ind_array_copied[0]:   |Betty|   
(11)      ind_array_copied[1]:   |  345  89  |   
(11)  11: "$var":   |  345  89  |  
(11)  12: "$varcopy":   |  345  89  |  
Run Code Online (Sandbox Code Playgroud)