Usted debe utilizar printfen lugar deecho :
printf "%s\n" "${mtches[@]}"
Si mtchesestá vacío, todavía se generaría una línea vacía. Para dar cuenta de eso:
{ [ "${#mtches[@]}" -eq 0 ] || printf '%s\n' "${mtches[@]}"; } > file
En bash(y también shells POSIX), a menudo usa la matriz de Parámetros Posicionales como en "$@"lugar de "$*", a menos que tenga una razón especial. Eso también es cierto en los shells que admiten matrices regulares, desde man bash - sección Arrays :
Se puede hacer referencia a cualquier elemento de una matriz usando $ {name [subíndice]}. Las llaves son necesarias para evitar conflictos con los operadores de expansión de nombre de archivo del shell. Si el subíndice es '@' o '*', la palabra se expande a todos los miembros del nombre de la matriz. Estos subíndices difieren solo cuando la palabra aparece entre comillas dobles. Si la palabra está entre comillas dobles, $ {name [*]} se expande a una sola palabra con el valor de cada miembro de la matriz separado por el primer carácter de la variable IFS, y $ {name [@]} expande cada elemento de nombre a una palabra separada. Cuando no hay miembros de la matriz, $ {name [@]} se expande a nada. Si la expansión entre comillas dobles ocurre dentro de una palabra, la expansión del primer parámetro se une con la parte inicial de la palabra original, y la expansión del último parámetro se une con la última parte de la palabra original.
Úselo solo "${array[*]}"cuando desee unir todos los elementos de la matriz a una cadena.