【问题标题】:Clear part of associative array清除关联数组的一部分
【发布时间】:2020-12-19 20:07:41
【问题描述】:

我必须使用循环来清除关联数组中的一些数据,还是有更快更好的选择?

目前我正在使用:

until [[ $ploop1 -eq 99 ]]; do  ##do044
    ((++ploop1))
    hnr[$ploop1,2]=0
    hnr[$ploop1,3]=0
    hnr[$ploop1,4]=0
    hnr[$ploop1,5]=0
done  ##do044

请注意,不应清除 ,0 和,1

【问题讨论】:

  • 内部循环会更容易,特别是如果有很多数字,例如:for x in {2..5}; do hnr[$ploop,$x]=0; done;如果您想删除/删除元素:unset hnr[$ploop,3] 或在循环中unset hnr[$ploop,$x] 甚至unset hnr[$ploop,{2..5}];我不知道有什么方法可以做hnr[$ploop,{2..5}]=0 之类的事情(不是说不能做,我只是不知道有什么方法)
  • @markp-fuso 但我仍然需要将它们放在一个循环中以计算 $ploop 数量?
  • 对,2 个循环:外循环:until [[ ... ]]; do ((++ploop1)); <inner_loop>; done 和内循环:for x in {2..5}; do hnr[$ploop,$x]=0; done;或者如果你想unset元素你可以用unset hnr[$ploop,{2..5}]替换内部循环@
  • @markp-fuso so unset=清除数组中当前指定位置的数据?
  • 您提到了clear the data,但实际上并没有清除数据……您将数据设置为0,即数组元素仍然存在;另一方面...unset 将清除、删除、删除、核对数组元素,即数组元素不再存在;并且 fwiw ... 刚刚发现 eval hnr[$ploop,{2..5}]=0 似乎有效(即,4 个数组元素被 设置0),但请记住,有些人可能会对此想法嗤之以鼻使用eval,ymmv ...

标签: bash shell loops associative-array


【解决方案1】:

将我的 cmets 合并到一个区域...

OP 提到了“清除数据”,但实际上将数组元素设置为0(零)。如果 OP 有要处理的数字列表,那么类似以下的内容也应该起作用:

until [[ $ploop1 -eq 99 ]]; do
    ((++ploop1))
    for x in {2..5}            # or `x in 2 3 4 5` or `x in {2..4} 5` or ...
    do
        hnr[$ploop1,$x]=0
    done
done

如果 OP 不介意使用 eval,可以将其缩短为:

until [[ $ploop1 -eq 99 ]]; do
    ((++ploop1))
    eval hnr[$ploop1,{2..5}]=0 
done

现在,如果 OP 想要 clear remove the elements 中的元素,那么这应该可以工作......

until [[ $ploop1 -eq 99 ]]; do
    ((++ploop1))
    unset hnr[$ploop1,{2..5}]
done

...只要针对数组元素发出unset 并且NOT 数组(即unset hnr),那么数组声明保持不变/有效,即不需要重新declare -A 数组。


添加菲利普的问题/评论:

如果 OPs 循环的全部目的是只是取消设置数组元素,那么以下应该消除循环的需要:

unset hnr[{0..99},{2..5}]

注意:OP可以根据实际使用范围调整数字...

【讨论】:

  • unset hnr[{0..99},{2..5}] 怎么样?
  • @Philippe 当然,这也应该有效;并且肯定会使 OP 的代码更小......我只是假设 OP 可能对外部循环和递减的 $ploop1 变量有更多计划;我已将您的问题/评论添加到答案中;谢谢
  • until ((ploop1++ == 99)); do declare "$(printf "hrr["$ploop1,"%d]=0 " {2..5})"; done and until ((ploop1++ == 99)); do unset hnr["$ploop1,"{2..5}]; done 这样可以避免使用邪恶的eval
猜你喜欢
  • 2013-11-14
  • 1970-01-01
  • 2011-05-23
  • 2012-12-19
  • 2021-02-16
  • 2012-11-17
  • 1970-01-01
  • 2014-09-02
  • 2017-06-28
相关资源
最近更新 更多