arrays are pretty useful variables that hold key:value data pairs, per default the “key” is an integer number, BUT: as shown there can also be associative arrays, meaning the index can be any string (needs bash version4)

this script demonstrates array creation, updating an element’s value.

check your bash version:

bash --version
GNU bash, version 4.2.46(2)-release (x86_64-redhat-linux-gnu)
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

the array example test demo script:


echo "=====this creates an array====="
month=("Jan" "Feb" "Mar" "Apr" "May" "Jun" "Jul" "Aug" "Sep" "Oct" "Nov")

# add or change element to/in array

echo "=====this creats an associative array====="
declare -A color
echo ${color[elephant]}

echo "=====this prints out the 4th element in the array====="
echo ${month[3]}

echo "=====this iterates over an array====="

for i in "${!month[@]}"
  echo "key  : $i"
  echo "value: ${month[$i]}"

echo "this can iterate over integer-index and associative arrays"
for i in "${!color[@]}"
  echo "key  : $i"
  echo "value: ${color[$i]}"

echo "=====print whole array====="
printf "%s\n" "${month[@]}"
printf "%s\n" "${color[@]}"

about declare (build in command)

declare [-aAfFgilrtux] [-p] [name[=value] …]
typeset [-aAfFgilrtux] [-p] [name[=value] …]

Declare variables and/or give them attributes.

If no names are given then display the values of variables.

The -p option will display the attributes and values of each name.

When -p is used with name arguments, additional options are ignored.

When -p is supplied without name arguments, it will display the attributes and values of all variables having the attributes specified by the additional options.

If no other options are supplied with -p, declare will display the attributes and values of all shell variables.

The -f option will restrict the display to shell functions.

The -F option inhibits the display of function definitions; only the function name and attributes are printed.

If the extdebug shell option is enabled using shopt, the source file name and line number where the function is defined are displayed as well.

The -F option implies -f.

The -g option forces variables to be created or modified at the global scope, even when declare is executed in a shell function. It is ignored in all other cases. The following options can be used to restrict output to variables with the specified attribute or to give variables attributes:

-a Each name is an indexed array variable (see Arrays above).
-A Each name is an associative array variable (see Arrays above).
-f Use function names only.
-i The variable is treated as an integer; arithmetic evaluation (see ARITHMETIC EVALUATION above) is performed when the variable is assigned a value.
-l When the variable is assigned a value, all upper-case characters are converted to lower-case. The upper-case attribute is disabled.
-r Make names readonly. These names cannot then be assigned values by subsequent assignment statements or unset.
-t Give each name the trace attribute. Traced functions inherit the DEBUG and RETURN traps from the calling shell. The trace attribute has no special meaning for variables.
-u When the variable is assigned a value, all lower-case characters are converted to upper-case. The lower-case attribute is disabled.
-x Mark names for export to subsequent commands via the environment.

Using `+’ instead of `-‘ turns off the attribute instead, with the exceptions that +a may not be used to destroy an array variable and +r will not remove the readonly attribute. When used in a function, makes each name local, as with the local command, unless the -g option is supplied, If a variable name is followed by =value, the value of the variable is set to value.

The return value is 0 unless an invalid option is encountered, an attempt is made to define a function using “-f foo=bar”, an attempt is made to assign a value to a readonly variable, an attempt is made to assign a value to an array variable without using the compound assignment syntax (see Arrays above), one of the names is not a valid shell variable name, an attempt is made to turn off readonly status for a readonly variable, an attempt is made to turn off array status for an array variable, or an attempt is made to display a non-existent function with -f.