首页 > 解决方案 > 清除关联数组的一部分

问题描述

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

目前我正在使用:

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 不应该被清除

标签: bashshellloopsassociative-array

解决方案


将我的评论合并到一个区域...

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针对数组元素而不是数组(即unset hnr)发出 ,那么数组声明保持不变/有效,即无需重新declare -A数组。


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

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

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

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


推荐阅读