Bash Arrays
External
Internal
Indexed Arrays
External
- http://www.gnu.org/software/bash/manual/html_node/Arrays.html#Arrays
- http://tldp.org/LDP/abs/html/arrays.html
Indexed Arrays Overview
bash indexed arrays are 0-based and unidimensional. No explicit declaration is necessary if at least one element is initialized as described below:
Indexed Arrays 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.
Indexed Arrays Assignment
Assign Indexed Array Individual Elements
Individual elements are initialized by using ${var-name[index]}=value notation:
a[0]="something"
Entire Indexed Array
The (value ...) or ([index]=value ...) 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")
Indexed Arrays Reference
Reference Individual Indexed Array 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 Indexed Array Elements
If '@' or '*' is used as subscript, the following expressions expand to all members of the array:
${var_name[@]} ${var_name[*]}
Reference a Sub-Array
A contiguous sub-array can be referenced as follows:
${var_name[@]:from}
returns all elements of the array starting with the index 'from'.
${var_name[@]:from:to}
returns all elements of the array starting with the index 'from' up to index 'to'.
Length of an Indexed Array
${#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 over an Indexed Array
Using the Indexed Array 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.
Indexed Array Use Cases
Read the Content of a File into An Indexed 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 Indexed Array
Assing words read from stdin to an array:
Iterate Over the Argument List
args=("$@") for arg in ${args[@]}; do ... done
Associative Arrays
Associative Array 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.
Associative Array Declaration
Associative arrays must be explicitly declare before initialization, otherwise unexpected behavior may occur. For example, if multiple assignments are declared, only the last one is reflected in the state of the array. 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
Associative Array Assignment
Assign Individual Associative Array Elements
Individual elements are initialized by using ${var-name[key]}=value notation:
a["color"]="blue"
The associative array variable must be declared with -A before, otherwise only the last assignment is reflected in the state of the array.
Entire Associative Array
The (["key"]="value" ...) syntax can be used to initialize an entire array. The values must be separated by space:
a=(["color]="red" ["size"]="small")
Associative Array Reference
Reference Individual Associative Array 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.
Get All Associative Array Keys
The keys are accessed with ${!array[@]}
Get All Associative Array Values
If '@' or '*' is used as subscript, the following expressions expand to all values maintained in the array:
${array_var_name[@]} ${array_var_name[*]}
Size
${#var_name[@]} ${#var_name[*]}