Você deve usar em printfvez deecho :
printf "%s\n" "${mtches[@]}"
Se mtchesestiver vazio, isso ainda produziria uma linha vazia. Para explicar isso:
{ [ "${#mtches[@]}" -eq 0 ] || printf '%s\n' "${mtches[@]}"; } > file
Em bash(e também em shells POSIX), você geralmente usa a matriz Parâmetros Posicionais em "$@"vez de "$*", a menos que tenha um motivo especial. Isso também é verdade em shells que suportam matrizes regulares, do man bash - section Matrizes :
Qualquer elemento de uma matriz pode ser referenciado usando $ {name [subscript]}. Os colchetes são necessários para evitar conflitos com os operadores de expansão de nome de arquivo do shell. Se o subscrito for '@' ou '*', a palavra se expandirá para todos os membros do nome da matriz. Esses subscritos diferem apenas quando a palavra aparece entre aspas duplas. Se a palavra estiver entre aspas duplas, $ {name [*]} será expandida para uma única palavra com o valor de cada membro da matriz separado pelo primeiro caractere da variável IFS, e $ {name [@]} expandirá cada elemento do nome para uma palavra separada. Quando não há membros da matriz, $ {name [@]} se expande para nada. Se a expansão entre aspas ocorrer em uma palavra, a expansão do primeiro parâmetro será associada à parte inicial da palavra original e a expansão do último parâmetro será associada à última parte da palavra original.
Use somente "${array[*]}"quando desejar associar todos os elementos da matriz a uma sequência.