如何删除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数组中的确切元素?的主要内容,如果未能解决你的问题,请参考以下文章