【问题标题】:How to copy Associative Array without for loop如何在没有 for 循环的情况下复制关联数组
【发布时间】:2019-06-28 00:19:46
【问题描述】:

我正在寻找一种复制关联数组的有效方法,因为我在主脚本的两个嵌套 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[@]}")

【问题讨论】:

  • 循环是唯​​一的方法。但是,您没有嵌套循环。第一个循环进行复制,第二个循环(跟随第一个循环)不是必需的;它只是验证copyLinks 包含您想要的键值对(并且可以替换为declare -p copyLinks)。
  • 循环有什么问题?你担心速度吗?
  • 在我的主脚本中,我确实有两个嵌套循环,我使用数组中的数据来执行 distcp 命令。
  • This ksh example 也适用于 bash >= 4.0。 typeset 已过时。将其替换为declare
  • 是的,我担心速度,因为我的关联数组的长度是 50。

标签: bash shell sh associative-array


【解决方案1】:

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

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" )。然后执行。

【讨论】:

  • 如果sed 表达式写得更窄,我会更舒服一点。某些版本的 bash 可以在 declare -p 输出中放置文字换行符(当此类换行符出现在键或值中时);在这些情况下,即使 sed 表达式上没有 g 标志,也可能发生不止一次替换。
  • ...当然,可以将 sed 替换为参数扩展; ${var/search/replace} 只会将search 更改为replace 一次,无论var 的内容有多少行。所以这通常是一个很好的方法,只是边缘有修补的空间。
猜你喜欢
  • 1970-01-01
  • 2021-11-18
  • 2021-01-29
  • 1970-01-01
  • 2017-03-25
  • 2012-06-29
  • 1970-01-01
  • 2019-09-02
  • 2019-12-06
相关资源
最近更新 更多