Eu encontrei uma boa solução para isso (acho que funcionaria para qualquer array de entrada), ele usa o recurso printf "%q"
.
Você pode escrever:
cmd=(
"printf '%s\n'"
"foo bar"
"baz bang"
)
stringified="$(printf "%q " "${cmd[@]}")"
Isso dá:
printf\ \'%s\n\' foo\ bar baz\ bang
Explicação
O comando printf "% q" escapa caracteres a serem usados no shell:
%q ARGUMENT is printed in a format that can be reused as shell input, escaping non-printable characters with the proposed POSIX $'' syntax.
Source : man printf
Ao usar "%q "
, todos os elementos na matriz são impressos e com escape correto e, como há um espaço após o %q
, todos os elementos serão delimitados por um espaço.