我需要从bash shell中的数组中删除一个元素。一般来说,我会简单地这样做:
array=("${(@)array:#<element to remove>}")不幸的是,我想要删除的元素是一个变量,所以我不能使用前面的命令。下面是一个例子:
array+=(pluto)
array+=(pippo)
delete=(pluto)
array( ${array[@]/$delete} ) -> but clearly doesn't work because of {}有什么想法吗?
发布于 2013-06-01 00:33:04
以下代码在bash和zsh中的工作方式与您希望的一样
$ array=(pluto pippo)
$ delete=pluto
$ echo ${array[@]/$delete}
pippo
$ array=( "${array[@]/$delete}" ) #Quotes when working with strings如果需要删除多个元素:
...
$ delete=(pluto pippo)
for del in ${delete[@]}
do
array=("${array[@]/$del}") #Quotes when working with strings
done警告
这种技术实际上从元素中删除了与$delete匹配的前缀,而不一定是整个元素。
更新
要真正删除精确的项,需要遍历数组,将目标与每个元素进行比较,并使用unset删除完全匹配的项。
array=(pluto pippo bob)
delete=(pippo)
for target in "${delete[@]}"; do
for i in "${!array[@]}"; do
if [[ ${array[i]} = $target ]]; then
unset 'array[i]'
fi
done
done请注意,如果执行此操作,并且删除了一个或多个元素,则索引将不再是连续的整数序列。
$ declare -p array
declare -a array=([0]="pluto" [2]="bob")简单的事实是,数组并不是为用作可变数据结构而设计的。它们主要用于在单个变量中存储项目列表,而不需要浪费一个字符作为分隔符(例如,存储可以包含空格的字符串列表)。
如果间隙是一个问题,则需要重新构建阵列以填补间隙:
for i in "${!array[@]}"; do
new_array+=( "${array[i]}" )
done
array=("${new_array[@]}")
unset new_array发布于 2015-06-30 02:21:42
您可以构建一个没有不需要的元素的新数组,然后将其分配回旧数组。这在bash中有效
array=(pluto pippo)
new_array=()
for value in "${array[@]}"
do
[[ $value != pluto ]] && new_array+=($value)
done
array=("${new_array[@]}")
unset new_array这会产生以下结果:
echo "${array[@]}"
pippo发布于 2017-12-14 01:05:59
如果您知道某个值的位置,这是取消设置该值的最直接方法。
$ array=(one two three)
$ echo ${#array[@]}
3
$ unset 'array[1]'
$ echo ${array[@]}
one three
$ echo ${#array[@]}
2https://stackoverflow.com/questions/16860877
复制相似问题