首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从Bash数组中移除元素

从Bash数组中移除元素
EN

Stack Overflow用户
提问于 2013-05-31 23:31:23
回答 20查看 180.2K关注 0票数 145

我需要从bash shell中的数组中删除一个元素。一般来说,我会简单地这样做:

代码语言:javascript
复制
array=("${(@)array:#<element to remove>}")

不幸的是,我想要删除的元素是一个变量,所以我不能使用前面的命令。下面是一个例子:

代码语言:javascript
复制
array+=(pluto)
array+=(pippo)
delete=(pluto)
array( ${array[@]/$delete} ) -> but clearly doesn't work because of {}

有什么想法吗?

EN

回答 20

Stack Overflow用户

回答已采纳

发布于 2013-06-01 00:33:04

以下代码在bashzsh中的工作方式与您希望的一样

代码语言:javascript
复制
$ array=(pluto pippo)
$ delete=pluto
$ echo ${array[@]/$delete}
pippo
$ array=( "${array[@]/$delete}" ) #Quotes when working with strings

如果需要删除多个元素:

代码语言:javascript
复制
...
$ delete=(pluto pippo)
for del in ${delete[@]}
do
   array=("${array[@]/$del}") #Quotes when working with strings
done

警告

这种技术实际上从元素中删除了与$delete匹配的前缀,而不一定是整个元素。

更新

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

代码语言:javascript
复制
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

请注意,如果执行此操作,并且删除了一个或多个元素,则索引将不再是连续的整数序列。

代码语言:javascript
复制
$ declare -p array
declare -a array=([0]="pluto" [2]="bob")

简单的事实是,数组并不是为用作可变数据结构而设计的。它们主要用于在单个变量中存储项目列表,而不需要浪费一个字符作为分隔符(例如,存储可以包含空格的字符串列表)。

如果间隙是一个问题,则需要重新构建阵列以填补间隙:

代码语言:javascript
复制
for i in "${!array[@]}"; do
    new_array+=( "${array[i]}" )
done
array=("${new_array[@]}")
unset new_array
票数 221
EN

Stack Overflow用户

发布于 2015-06-30 02:21:42

您可以构建一个没有不需要的元素的新数组,然后将其分配回旧数组。这在bash中有效

代码语言:javascript
复制
array=(pluto pippo)
new_array=()
for value in "${array[@]}"
do
    [[ $value != pluto ]] && new_array+=($value)
done
array=("${new_array[@]}")
unset new_array

这会产生以下结果:

代码语言:javascript
复制
echo "${array[@]}"
pippo
票数 33
EN

Stack Overflow用户

发布于 2017-12-14 01:05:59

如果您知道某个值的位置,这是取消设置该值的最直接方法。

代码语言:javascript
复制
$ array=(one two three)
$ echo ${#array[@]}
3
$ unset 'array[1]'
$ echo ${array[@]}
one three
$ echo ${#array[@]}
2
票数 17
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16860877

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档