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 IFS
variável especial.
$ System=('s1' 's2' 's3' 's4 4 4')
$ ( IFS=$'\n'; echo "${System[*]}" )
Usamos um subshell para evitar a substituição do valor de IFS
no ambiente atual. Nesse subshell, modificamos o valor de IFS
para 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 printf
a -v
opçã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 printf
para 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[@]}"