如何删除在bash数组的确切元素?(How to delete an exact element i

2019-08-06 09:03发布

我想从一个bash数组中删除随便一个一个关键字的首次亮相

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

我删除关键字是这样的: ARRAY=( ${ARRAY[@]/"$keyword"/} )然后如果“红色”是第一个被发现的关键字,将剥离‘ ’从两个关键字并返回为“foo酒吧净“而不是‘富酒吧红网’。

编辑:这是例子,希望这使得它更清晰。

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)返回净rd3.0代替红网rd3.0

如果我使用未设置,: unset ${ARRAY["$keyword"]} bash的抱怨,如果rd3.0是数组中: :syntax error: invalid arithmetic operator (error token is ".0")什么是安全的方式来取消或从阵列中移除只是精确匹配?

Answer 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


Answer 2:

第一:你应该在阵列周围使用你的钥匙引号。 这避免了例如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 (你永远都需要的一切)



文章来源: How to delete an exact element in a bash array?