加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

数组 – 从Bash数组中删除元素时出现不一致

发布时间:2020-12-15 21:36:13 所属栏目:安全 来源:网络整理
导读:使用bash数组时,可以按以下方式删除元素: unset array[i] # where i is the array index 这个问题是在未设置的${array [@]]没有真正有效之后.是 它确实为您提供了活动数组元素的数量,但不是实际的数组 深度.数组中已删除索引的索引仍然存在.它只是 已设置为
使用bash数组时,可以按以下方式删除元素:

unset array[i]   # where i is the array index

这个问题是在未设置的${array [@]]没有真正有效之后.是
它确实为您提供了活动数组元素的数量,但不是实际的数组
深度.数组中已删除索引的索引仍然存在.它只是
已设置为inactive / null.例如:

declare -a array=( a b c d e )
unset array[2]

for ((i=0; i < ${#array[@]}; i++)) ; do
    echo "$i: ${array[$i]}"
done

输出以下内容:

0: a
1: b
2:
3: d

array [2]仍然存在,但设置为null或inactive

array [4](e)没有显示,因为${#array [@]}是活动的数量
数组元素而不是真正的数组元素深度.这非常混乱
每次元素未设置时快速

作为示例,请考虑以下代码:

#array包含0个或更多字符串
#remove查找并删除给定的字符串

remove () {

    local str=$1

    for (( i = 0 ; i < ${#array[@]}; i++ )) ; do
        if [[ "${array[$i]}" == "$str" ]] ; then
            unset array[$i]
            return 0
        fi
    done

    echo "$str: not registered"

    return 0
}

这仅在第一次调用remove时有效.在那之后,有效
元素可能会被遗漏.

解决此问题的一个方法是在取消设置后添加以下行:

unset array[$i]
  +  array=( "${array[@]}" )

这会重新初始化数组,并完全删除元素.

这个问题,这感觉很糟糕.

所以我的问题是这样的:

1)有没有办法获得真正的数组元素深度?

2)有没有一种方法可以在迭代时检测到数组的结尾?

3)还有另一种清洁剂解决方案吗?

解决方法

理解为什么((i = 0; i< ${#array [@]}; i))被破坏了 在你要求的意义上,没有“真正的数组元素深度”这样的东西. Bash数组不是真正的数组 – 它们是哈希映射(对于常规数组进行数字索引,由bash 4.0的新“关联数组”的字符串索引).因此,绝对没有理由从0开始键 – 你可以有如下数组:declare -a array =([1000] =“one thousand”[2000] =“two thousand”[3000] =“三千”),它的长度正好是3;这些项目之间没有一堆NUL /空元素(分别用1000,1000和3000键查找). 安全地从稀疏阵列中删除元素 如果要按索引删除,请迭代索引.而“${array [@]}”迭代数组中的项目,“${!array [@]}”(注意!)通过索引进行迭代,通过这些索引可以查找这些项. 正如您所观察到的那样,假设索引的范围从0到数组中的项目总数是不安全的,因为允许bash数组稀疏 – 但是没有理由编写代码来在第一名.

for array_idx in "${!array[@]}"; do
  unset "array[$array_idx]"
done

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读