如何在不使用for循环的情况下复制关联数组

问题描述 投票:0回答:2

我正在寻找一种有效的方法来复制关联数组,因为我正在主脚本中的两个嵌套 for 循环内执行此操作。

这是我在主脚本中使用的通用格式:

#!/bin/bash
declare -A oldLinks
oldLinks["A"]="linkA"
oldLinks["B"]="linkB"
oldLinks["C"]="linkC"
oldLinks["D"]="linkD"
#!/bin/bash
source exportThis.sh
declare -A copyLinks
for i in "${!oldLinks[@]}"; do 
 copyLinks[$i]=${oldLinks[$i]}
done
for k in "${!copyLinks[@]}"; do
  echo "$k -- ${copyLinks[$k]}"
done

当我在主脚本中这样做时,我收到此错误:

bash: copyLinks: "${oldLinks[@]}": must use subscript when assigning associative array
copyLinks=("${oldLinks[@]}")
bash shell sh associative-array
2个回答
2
投票

只需打印旧值并重命名变量值。然后来源。前任。像这样:

eval "$(declare -p oldLinks | sed 's/oldLinks/copyLinks/')"

declare -p oldLinks
将打印
declare -A oldLinks=([A]="linkA" [B]="linkB" [C]="linkC" [D]="linkD" )
。然后你用
oldLinks
代替
copyLinks
,所以它变成了
declare -A copyLinks=([A]="linkA" [B]="linkB" [C]="linkC" [D]="linkD" )
。然后执行它。


0
投票

聚会迟到了,我今天刚刚发现如何使用

paste
以及复制关联数组的一些基本技巧。

declare -A oldLinks
oldLinks["A"]="linkA"
oldLinks["B"]="linkB"
oldLinks["C"]="linkC"
oldLinks["D"]="linkD"

declare -A copyLinks='('$(paste -d '=' <(printf '[%s]\n' "${!oldLinks[@]}") <(printf "'%s'\n" "${oldLinks[@]}"))')'
declare -p copyLinks
-> declare -A copyLinks=([D]="linkD" [C]="linkC" [B]="linkB" [A]="linkA" )

paste
合并 2 个或多个文件,但按顺序写入由每个文件的相应项目组成的行,并用制表符或其他内容分隔。

这里我们组合了用

printf
创建的 2 个伪文件,第一个是原始数组的键列表,第二个是其项目列表。我们使用分隔符选项
-d '='
,以便每一行都以
[key]="item"
的形式写入,最后在使用
declare -A array=(...)
创建新数组之前,在每一行末尾添加括号(不要省略声明 -A 否则它不会工作)。

在某些复杂的情况下它可能会崩溃,但对于整数和字符串来说它工作得很好。

© www.soinside.com 2019 - 2024. All rights reserved.