You should use printf
instead of echo
:
printf "%s\n" "${mtches[@]}"
If mtches
is empty that would still output one empty line. To account for that:
{ [ "${#mtches[@]}" -eq 0 ] || printf '%s\n' "${mtches[@]}"; } > file
In bash
(and also POSIX shells), you often use Positional Parameters array as"$@"
instead of "$*"
, unless you have a special reason. That's also true in shells that support regular arrays, from man bash - section Arrays:
Any element of an array may be referenced using ${name[subscript]}.
The braces are required to avoid conflicts with the shell’s filename
expansion operators. If the subscript is ‘@’ or ‘*’, the word expands
to all members of the array name. These subscripts differ only when
the word appears within double quotes. If the word is double-quoted,
${name[*]} expands to a single word with the value of each array
member separated by the first character of the IFS variable, and
${name[@]} expands each element of name to a separate word. When there
are no array members, ${name[@]} expands to nothing. If the
double-quoted expansion occurs within a word, the expansion of the
first parameter is joined with the beginning part of the original
word, and the expansion of the last parameter is joined with the last
part of the original word. This is analogous to the expansion of the
special parameters ‘@’ and ‘*’
Only use "${array[*]}"
when you want join all array elements to a string.