Usar substituição de string para combinar array?

Usar substituição de string para combinar array?

Estou tentando usar a substituição de string para combinar um array. Saída:

a,b,c

O procedimento abaixo funciona, mas não há como fazer isso sem tubulação?

#!/bin/bash

words=(a b c)

echo "${words[@]}" | sed 's/ /,/g'

Eu tentei isso, o que não funciona.

echo "${words[@]// /,/}"

Responder1

Se você deseja gerar uma string que consiste nos elementos de uma matriz delimitada por um caractere específico, use

words=(a b c)

( IFS=,; printf '%s\n' "${words[*]}" )

Usar *no lugar de @in "${words[*]}"criará uma única string a partir da concatenação de todos os elementos do array words. Os elementos serão delimitados pelo primeiro caractere $IFS, por isso colocamos uma vírgula antes de fazer a expansão.

Eu configurei IFSum subshell para evitar configurá-lo inadvertidamente para qualquer outra operação além da expansão única necessária para criar a string delimitada por vírgula para a printfchamada.

Em vez de usar um subshell para definir IFSlocalmente, você pode configurá-lo e redefini-lo:

words=(a b c)

IFS=,$IFS
printf '%s\n' "${words[*]}"
IFS=${IFS#?}

Isso primeiro adiciona uma vírgula como o primeiro caractere de $IFS, mantendo o valor antigo da variável como os caracteres após a vírgula.

A substituição do parâmetro ${IFS#?}excluiria o primeiro caractere (a vírgula que adicionamos).

informação relacionada