Using [*] will create a single string, with each element of your array delimited byjoined with the first character of $IFS (a space by default) in between elements¹.
Using [@] will create a list.
Examples:
Creating an array:
$ list=( a b "big fish" c d ) Printing each element individually:
$ printf 'data: ---%s---\n' "${list[@]}" data: ---a--- data: ---b--- data: ---big fish--- data: ---c--- data: ---d--- Creating a single string and printing that:
$ printf 'data: ---%s---\n' "${list[*]}" data: ---a b big fish c d--- Again, but with a custom delimiter:
$ IFS='/' $ printf 'data: ---%s---\n' "${list[*]}" data: ---a/b/big fish/c/d--- Note that using these expansions without double quotes rarely makes sense.
¹ or nothing if $IFS is set but empty (after IFS=) or a space if $IFS is unset (after unset -v IFS) with some variations between shells if the first character of $IFS is a multibyte character, or something that cannot be decoded as a character.