删除精确的bash数组元素?

mat*_*eor 7 arrays bash unset

我试图从bash数组中删除任何一个关键字的第一个外观.

ARRAY=(foo bar and any number of keywords)
keywords=(red, rednet, rd3.0)
Run Code Online (Sandbox Code Playgroud)

我删除了这样的关键字: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
Run Code Online (Sandbox Code Playgroud)

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

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

hig*_*aro 8

使用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
Run Code Online (Sandbox Code Playgroud)

  • 值得注意的是,这实际上并没有从数组中删除元素,只是将其设置为空白.所以,如果你运行`a =(abc); 未设置[1]; echo $ {a [1]}`你不会像你想象的那样得到`c`,但无论是在一个空白元素中.要真正删除元素,你应该使用'a =($ {a [@]}`之类的`unset`来向前移动其他元素以获取空白元素. (4认同)