7

我试图从 bash 数组中删除任何一个关键字的第一次出现

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

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

编辑:这是示例,希望这可以使其更清楚。

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") 中取消设置或删除完全匹配的安全方法是什么?

4

2 回答 2

9

使用unset数组值为 at 的命令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
于 2013-01-10T22:09:39.950 回答
0

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

像那样:

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

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

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

于 2013-01-10T20:52:44.787 回答