如何删除bash数组中的确切元素?

Posted

技术标签:

【中文标题】如何删除bash数组中的确切元素?【英文标题】:How to delete an exact element in a bash array? 【发布时间】:2012-12-25 08:24:34 【问题描述】:

我正在尝试从 bash 数组中删除任何一个关键字的只是第一次出现

ARRAY=(foo bar and any number of keywords)
keywords=(red, rednet, rd3.0)

我删除这样的关键字:ARRAY=( $ARRAY[@]/"$keyword"/ ) 然后如果“red”是第一个找到的关键字,它将从两个关键字中删除 'red' 并返回“foo bar net”而不是“富吧红网”。

编辑:这是一个例子,希望这能让它更清楚。

for keyword in $ARRAY[@]; do
      if [ "$keyword" = "red" ] || [ "$keyword" = "rd3.0" ] || [ "$keyword" = "rednet" ]; then
           # HERE IS TROUBLE
           ARRAY=( $ARRAY[@]/"$keyword"/ )
           echo "ARRAY is now $ARRAY[@]"
           break
      fi
 done

如果ARRAY=(red rednet rd3.0) 返回 net rd3.0 而不是 rednet rd3.0

如果我使用 unset,:unset $ARRAY["$keyword"] 如果 rd3.0 在数组中,bash 会抱怨::syntax error: invalid arithmetic operator (error token is ".0") 从数组中取消设置或删除完全匹配的安全方法是什么?

【问题讨论】:

【参考方案1】:

使用unset 命令,数组值为index,如下所示:

#!/usr/bin/env bash
ARRAY=(foo bar any red alpha number of keywords rd3.0 and)
keywords=(red, rednet, rd3.0)

index=0
for keyword in $ARRAY[@]; do
      if [ "$keyword" = "red" ] || [ "$keyword" = "rd3.0" ] || [ "$keyword" = "rednet" ]; then
           # HERE IS TROUBLE
           # ARRAY=( $ARRAY[@]/"$p"/ )
           unset ARRAY[$index]
           echo "ARRAY is now: $ARRAY[@]"
           break
      fi
      let index++
 done

【讨论】:

我明白了。我能做到。非常感谢! 值得注意的是,这实际上并没有从数组中删除元素,只是将其设置为空白。因此,如果您运行a=( a b c ); unset a[1]; echo $a[1],您将不会得到您所期望的c,而是空白元素中的任何内容。要真正删除该元素,您应该遵循unset 之类的a=( $a[@] 将其他元素向前移动以取代空白的位置。 循环后重置索引:ARRAY=("$ARRAY[@]")【参考方案2】:

首先:您应该在数组中的键周围使用引号。这避免了例如 rd3.0 的问题。

这样:

ARRAY=("foo" "bar" "and" "any" "number" "of" "keywords")
keywords=("red", "rednet", "rd3.0")

在我看来,您需要复制数组,然后使用 for 循环来过滤关键字。第一次成功过滤后退出for循环。之后将其复制回来,而不使用空数组元素。请参阅this 简短示例(第 10 段)。

有关数组的更多信息:http://tldp.org/LDP/abs/html/arrays.html(您将需要的一切)

【讨论】:

在我的脚本中,这实际上是初始数组的副本。我只是在这里缩短了它。我也在使用 for 循环来迭代它,然后退出。我已经关注了您的链接并多次看到它......我的问题不是关于数组,而是我认为它正在处理文本。我得到一个像这样的字符串,最初是“red rednet rd3.0”。我应该重新格式化以穿插您认为的冒号吗? 冒号是指引号吗?冒号是:,引号是"" Michael Kjörling:很久以前,但我的帖子中没有看到冒号。你似乎是对的。 :-)

以上是关于如何删除bash数组中的确切元素?的主要内容,如果未能解决你的问题,请参考以下文章

如何删除bash中数组的最后一个元素?

从 Bash 数组中删除一个元素

java如何删除掉数组中的某个元素??

java如何删除掉数组中的某个元素??

java如何删除掉数组中的某个元素??

java中 如何在一个数组中删除里面的元素