Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Add a new element to an array without specifying the index in Bash

Tags:

arrays

bash

Is there a way to do something like PHPs $array[] = 'foo'; in bash vs doing:

array[0]='foo'
array[1]='bar'
like image 200
Darryl Hein Avatar asked Dec 23 '09 08:12

Darryl Hein


People also ask

How do you add an element to an array in bash?

To append element(s) to an array in Bash, use += operator.

How do I modify an array in bash?

To update element of an array in Bash, access the element using array variable and index, and assign a new value to this element using assignment operator.

How do I append to a list in bash?

Using shorthand operators is the simplest way to append an element at the end of an array. In the following script, an array with 6 elements is declared. Next '+=' shorthand operator is used to insert a new element at the end of the array. 'for' loop is used here to iterate the array and print the array elements.


5 Answers

Yes there is:

ARRAY=()
ARRAY+=('foo')
ARRAY+=('bar')

Bash Reference Manual:

In the context where an assignment statement is assigning a value to a shell variable or array index (see Arrays), the ‘+=’ operator can be used to append to or add to the variable's previous value.

Also:

When += is applied to an array variable using compound assignment (see Arrays below), the variable's value is not unset (as it is when using =), and new values are appended to the array beginning at one greater than the array's maximum index (for indexed arrays)

like image 69
Etienne Dechamps Avatar answered Nov 09 '22 23:11

Etienne Dechamps


As Dumb Guy points out, it's important to note whether the array starts at zero and is sequential. Since you can make assignments to and unset non-contiguous indices ${#array[@]} is not always the next item at the end of the array.

$ array=(a b c d e f g h)
$ array[42]="i"
$ unset array[2]
$ unset array[3]
$ declare -p array     # dump the array so we can see what it contains
declare -a array='([0]="a" [1]="b" [4]="e" [5]="f" [6]="g" [7]="h" [42]="i")'
$ echo ${#array[@]}
7
$ echo ${array[${#array[@]}]}
h

Here's how to get the last index:

$ end=(${!array[@]})   # put all the indices in an array
$ end=${end[@]: -1}    # get the last one
$ echo $end
42

That illustrates how to get the last element of an array. You'll often see this:

$ echo ${array[${#array[@]} - 1]}
g

As you can see, because we're dealing with a sparse array, this isn't the last element. This works on both sparse and contiguous arrays, though:

$ echo ${array[@]: -1}
i
like image 22
Dennis Williamson Avatar answered Nov 10 '22 00:11

Dennis Williamson


$ declare -a arr
$ arr=("a")
$ arr=("${arr[@]}" "new")
$ echo ${arr[@]}
a new
$ arr=("${arr[@]}" "newest")
$ echo ${arr[@]}
a new newest
like image 45
ghostdog74 Avatar answered Nov 10 '22 01:11

ghostdog74


If your array is always sequential and starts at 0, then you can do this:

array[${#array[@]}]='foo'

# gets the length of the array
${#array_name[@]}

If you inadvertently use spaces between the equal sign:

array[${#array[@]}] = 'foo'

Then you will receive an error similar to:

array_name[3]: command not found
like image 27
Dumb Guy Avatar answered Nov 10 '22 00:11

Dumb Guy


With an indexed array, you can to something like this:

declare -a a=()
a+=('foo' 'bar')
like image 28
Grégory Roche Avatar answered Nov 10 '22 01:11

Grégory Roche