Bash Arrays

From NovaOrdis Knowledge Base
Jump to navigation Jump to search

Internal

Indexed Arrays

External

Overview

bash indexed arrays are 0-based and unidimensional. No explicit declaration is necessary if at least one element is initialized as described below:

Declaration

Arrays do not need explicit declarations, they will be automatically declared upon the first assignment of any of their elements:

my_array_var[0]="something"

They can be explicitly declared, though:

declare -a my_array_var

Previously declared arrays can be listed with:

declare -a

An array variable can be "undeclared" with the "unset" builtin.

unset my_array_var

Individual array elements can also be unset:

unset my_array_var[subscript] 

A subscript of "*" or "@" also removes the entire array.

Assignment

Assign Individual Elements

Individual elements are initialized by using ${var-name[key]}=value notation:

a["color"]="blue"

Entire Array

The (["key"]="value ...) syntax can be used to initialize an entire array. The values must be separated by space:

a=(["color]="blue" ["size"]="large")

Reference

Reference Individual Elements

Element arrays can be referenced with ${var-name[key]} notation:

echo ${a["color"]}

If the array variable was not previously declared, or if the specific element was not initialized, a reference attempt will return the blank string.

Reference All Elements

If '@' or '*' is used as subscript, the following expressions expand to all members of the array:

${var_name[@]}
${var_name[*]}

Length

${#var_name[@]}
${#var_name[*]}

If the array is sparse, this does not return the index of last element plus one, but just the number of non-empty elements.

Iterate

Using the Elements

for i in ${array_var[@]}; do
   ...
done

Using the Index

i=0
while [[ ${i} < ${#array_var[@]} ]]; do
  echo ${array_var[$i]}
  ((i++))
done

Note that this does not work when the array is sparse, because ${#array_var[@]} only returns the number of non-empty elements, and not the array length.

Use Cases

Read the Content of a File into An Array

Each line will be assigned to an element of the array:

readarray < ./somefile.txt -t my_array_var

Assign Words Read from stdin to an Array

Assing words read from stdin to an array:

read -a

Iterate Over the Argument List

args=("$@")
for arg in ${args[@]}; do
  ...
done

Associative Arrays

Overview

Associative arrays can be used to implement sets and maps in bash. The most common usage as set is to insert elements whose subscript is identical with the value.

Declaration


Associative arrays must be explicitly declare before initialization, otherwise unexpected behavior may occur. This is different from the behavior of the indexed arrays, which can be used without explicit declaration.

declare -A my_assoc_array

Previously declared associative arrays can be listed with:

declare -A

An associative array variable can be "undeclared" with the "unset" builtin.

unset my_assoc_array

Assignment

Assign Individual Elements

Individual elements are initialized by using ${var-name[key]}=value notation:

a["color"]="blue"

Entire Array

The (...) syntax can be used to initialize an entire array. The values must be separated by space:

a=("X" "Y" "Z")

If we want initialize only specific elements, we can use this syntax:

a=([0]="X" [4]="Y" [8]="Z")

Reference

Reference Individual Elements

Element arrays can be referenced with ${var-name[index]} notation:

echo ${a[0]}

If the array variable was not previously declared, or if the specific element was not initialized, a reference attempt will return the blank string.

Reference All Elements

If '@' or '*' is used as subscript, the following expressions expand to all members of the array:

${var_name[@]}
${var_name[*]}

Length

${#var_name[@]}
${#var_name[*]}

If the array is sparse, this does not return the index of last element plus one, but just the number of non-empty elements.

Iterate

Using the Elements

for i in ${array_var[@]}; do
   ...
done

Using the Index

i=0
while [[ ${i} < ${#array_var[@]} ]]; do
  echo ${array_var[$i]}
  ((i++))
done

Note that this does not work when the array is sparse, because ${#array_var[@]} only returns the number of non-empty elements, and not the array length.

Use Cases

Read the Content of a File into An Array

Each line will be assigned to an element of the array:

readarray < ./somefile.txt -t my_array_var

Assign Words Read from stdin to an Array

Assing words read from stdin to an array:

read -a

Iterate Over the Argument List

args=("$@")
for arg in ${args[@]}; do
  ...
done