Como faço para converter uma variável de array bash em uma string delimitada por novas linhas?

Como faço para converter uma variável de array bash em uma string delimitada por novas linhas?

Quero escrever uma variável de array bash em um arquivo, com cada elemento em uma nova linha. Eu poderia fazer isso com um loop for, mas existe outra maneira (mais limpa) de unir os elementos \n?

Responder1

Aqui está uma maneira que utiliza a expansão de parâmetros do bash e sua IFSvariável especial.

$ System=('s1' 's2' 's3' 's4 4 4')
$ ( IFS=$'\n'; echo "${System[*]}" )

Usamos um subshell para evitar a substituição do valor de IFSno ambiente atual. Nesse subshell, modificamos o valor de IFSpara que o primeiro caractere seja uma nova linha (usando $'...'aspas). Finalmente, usamos a expansão de parâmetros para imprimir o conteúdo do array como uma única palavra; cada elemento é separado pelo primeiro caractere de IFS.

Para capturar para uma variável:

$ var=$( IFS=$'\n'; echo "${System[*]}" )

Se o seu bash for novo o suficiente (4.2 ou posterior), você ainda pode (e deve) usar printfa -vopção:

$ printf -v var "%s\n" "${System[@]}"

Em ambos os casos, você pode não querer a nova linha final em var. Para removê-lo:

$ var=${var%?}    # Remove the final character of var

Responder2

Você pode usar printfpara imprimir cada item do array em sua própria linha:

 $ System=('s1' 's2' 's3' 's4 4 4')
 $ printf "%s\n"  "${System[@]}"
s1
s2
s3
s4 4 4

Responder3

awk -v sep='\n' 'BEGIN{ORS=OFS="";for(i=1;i<ARGC;i++){print ARGV[i],ARGC-i-1?sep:""}}' "${arr[@]}"

ou

perl -le 'print join "\n",@ARGV' "${arr[@]}"

ou

python -c 'import sys;print "\n".join(sys.argv[1:])' "${arr[@]}"

ou

sh -c 'IFS=$'\''\n'\'';echo "$*"' '' "${arr[@]}"

ou

lua <(echo 'print(table.concat(arg,"\n"))') "${arr[@]}"

ou

tclsh <(echo 'puts [join $argv "\n"]') "${arr[@]}"

ou

php -r 'echo implode("\n",array_slice($argv,1));' -- "${arr[@]}"

ou

ruby -e 'puts ARGV.join("\n")' "${arr[@]}"

isso é tudo que posso lembrar até agora.

Responder4

Usandopara:

for each in "${alpha[@]}"
do
  echo "$each"
done

Usandohistória; observe que isso falhará se seus valores contiverem !:

history -p "${alpha[@]}"

Usandonome base; observe que isso falhará se seus valores contiverem /:

basename -a "${alpha[@]}"

Usandoshuf; observe que os resultados podem não sair em ordem:

shuf -e "${alpha[@]}"

informação relacionada