Eu não acho que haja algo errado com $ @.
Mas, no primeiro caso, para imprimir essa variável de forma limpa como um parâmetro que você atribuiu para curl com saída tendo novas linhas, em sua função echo_output () você precisa citar o "$ @", nesse caso "echo" (que por sua vez faz apenas imprimir seus argumentos posicionais em saída padrão e nada mais) vai dividir as palavras - > argumentos (parâmetros) corretamente. Como Dawud mencionou, é melhor usar o printf nesses casos.
Novamente no seu caso:
function echo_output() {
echo "$@"
}
fará isso.