Print BASH Array Elements on Separate Lines

Very easy and usually accomplished with a loop:

$ array=(red green blue)
$ for I in ${array[@]}; do echo $I; done
red
green
blue

But we can do better!:

$ printf '%s\n' "${array[@]}"

or:

$ ( IFS=$'\n'; echo "${array[*]}" )

Note the switch to "${array[*]}" from "${array[@]}" (the "quoting" is important!). Using [@] each element of the array is expanded into a separate quoted argument, while [*] expands to a single quoted argument of all elements -- with each element separated by the first character of the IFS variable (i.e. newlines in this case).

The above command also runs within a subshell so that IFS is restored after running the command. Also, the reason the value of IFS is a quoted \n starting with a $ is so bash expands the control sequence without dropping any trailing newlines (which command substitution does):

# expand control sequences without modification
$ echo -n $'\n' | od -c
0000000  \n
0000001

# with command substitution, no more \n
$ echo -n $(echo -ne '\n') | od -c
0000000