Remove an element from a Bash array Remove an element from a Bash array bash bash

Remove an element from a Bash array


The following works as you would like in bash and zsh:

$ array=(pluto pippo)$ delete=pluto$ echo ${array[@]/$delete}pippo$ array=( "${array[@]/$delete}" ) #Quotes when working with strings

If need to delete more than one element:

...$ delete=(pluto pippo)for del in ${delete[@]}do   array=("${array[@]/$del}") #Quotes when working with stringsdone

Caveat

This technique actually removes prefixes matching $delete from the elements, not necessarily whole elements.

Update

To really remove an exact item, you need to walk through the array, comparing the target to each element, and using unset to delete an exact match.

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  donedone

Note that if you do this, and one or more elements is removed, the indices will no longer be a continuous sequence of integers.

$ declare -p arraydeclare -a array=([0]="pluto" [2]="bob")

The simple fact is, arrays were not designed for use as mutable data structures. They are primarily used for storing lists of items in a single variable without needing to waste a character as a delimiter (e.g., to store a list of strings which can contain whitespace).

If gaps are a problem, then you need to rebuild the array to fill the gaps:

for i in "${!array[@]}"; do    new_array+=( "${array[i]}" )donearray=("${new_array[@]}")unset new_array


You could build up a new array without the undesired element, then assign it back to the old array. This works in bash:

array=(pluto pippo)new_array=()for value in "${array[@]}"do    [[ $value != pluto ]] && new_array+=($value)donearray=("${new_array[@]}")unset new_array

This yields:

echo "${array[@]}"pippo


This is the most direct way to unset a value if you know it's position.

$ array=(one two three)$ echo ${#array[@]}3$ unset 'array[1]'$ echo ${array[@]}one three$ echo ${#array[@]}2