开发者社区> 问答> 正文

从Bash数组中删除元素

我需要从bash shell中的数组中删除一个元素。通常,我只是做:

array=("${(@)array:# }") 不幸的是,我要删除的元素是一个变量,所以我不能使用上一个命令。下面是一个例子:

array+=(pluto) array+=(pippo) delete=(pluto) array( ${array[@]/$delete} ) -> but clearly doesn't work because of {} 任何想法?

展开
收起
保持可爱mmm 2020-02-08 11:57:53 1064 0
1 条回答
写回答
取消 提交回答
  • 您可以在bash和中进行以下操作zsh:

    $ array=(pluto pippo) $ delete=(pluto) $ echo ${array[@]/$delete} pippo $ array=( "${array[@]/$delete}" ) #Quotes when working with strings 如果需要删除多个元素:

    ... $ delete=(pluto pippo) for del in ${delete[@]} do array=("${array[@]/$del}") #Quotes when working with strings done 警告

    实际上,此技术$delete从元素(而不是整个元素)中删除匹配的前缀。

    更新资料

    要真正删除确切的项目,您需要遍历数组,将目标与每个元素进行比较,然后使用unset删除确切的匹配项。

    array=(pluto pippo bob) delete=(pippo) for target in "${delete[@]}"; do for i in "${!array[@]}"; do if [[ ${array[i]} = $target ]]; then unset 'array[i]' fi done done 请注意,如果执行此操作,并且删除了一个或多个元素,则索引将不再是连续的整数序列。

    $ declare -p array declare -a array=([0]="pluto" [2]="bob") 一个简单的事实是,数组并不是为用作可变数据结构而设计的。它们主要用于在单个变量中存储项目列表,而无需浪费字符作为定界符(例如,存储可以包含空格的字符串列表)。

    如果间隙是一个问题,那么您需要重新构建数组以填补间隙:

    for i in "${!array[@]}"; do new_array+=( "${array[i]}" ) done array=("${new_array[@]}") unset new_array

    2020-02-08 11:58:05
    赞同 展开评论 打赏
问答分类:
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载