我正在寻找一种有效的方法来复制关联数组,因为我正在主脚本中的两个嵌套 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[@]}")
只需打印旧值并重命名变量值。然后来源。前任。像这样:
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" )
。然后执行它。
聚会迟到了,我今天刚刚发现如何使用
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 否则它不会工作)。
在某些复杂的情况下它可能会崩溃,但对于整数和字符串来说它工作得很好。