数组 – 从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 [@]]没有真正有效之后.是 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 () { 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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |