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