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)
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)