Quiero escribir una variable de matriz bash en un archivo, con cada elemento en una nueva línea. Podría hacer esto con un bucle for, pero ¿hay otra forma (más limpia) de unir los elementos \n
?
Respuesta1
A continuación se muestra una forma que utiliza la expansión de parámetros de bash y su IFS
variable especial.
$ System=('s1' 's2' 's3' 's4 4 4')
$ ( IFS=$'\n'; echo "${System[*]}" )
Usamos una subcapa para evitar sobrescribir el valor de IFS
en el entorno actual. En esa subcapa, luego modificamos el valor de IFS
para que el primer carácter sea una nueva línea (usando $'...'
comillas). Finalmente, usamos la expansión de parámetros para imprimir el contenido de la matriz como una sola palabra; cada elemento está separado por el primer carácter deIFS
.
Para capturar a una variable:
$ var=$( IFS=$'\n'; echo "${System[*]}" )
Si tu bash es lo suficientemente nuevo (4.2 o posterior), aún puedes (y debes) usarlo printf
con la -v
opción:
$ printf -v var "%s\n" "${System[@]}"
En cualquier caso, es posible que no desee la nueva línea final en var
. Para eliminarlo:
$ var=${var%?} # Remove the final character of var
Respuesta2
Puede utilizar printf
para imprimir cada elemento de la matriz en su propia línea:
$ System=('s1' 's2' 's3' 's4 4 4')
$ printf "%s\n" "${System[@]}"
s1
s2
s3
s4 4 4
Respuesta3
awk -v sep='\n' 'BEGIN{ORS=OFS="";for(i=1;i<ARGC;i++){print ARGV[i],ARGC-i-1?sep:""}}' "${arr[@]}"
o
perl -le 'print join "\n",@ARGV' "${arr[@]}"
o
python -c 'import sys;print "\n".join(sys.argv[1:])' "${arr[@]}"
o
sh -c 'IFS=$'\''\n'\'';echo "$*"' '' "${arr[@]}"
o
lua <(echo 'print(table.concat(arg,"\n"))') "${arr[@]}"
o
tclsh <(echo 'puts [join $argv "\n"]') "${arr[@]}"
o
php -r 'echo implode("\n",array_slice($argv,1));' -- "${arr[@]}"
o
ruby -e 'puts ARGV.join("\n")' "${arr[@]}"
eso es todo lo que puedo recordar hasta ahora.
Respuesta4
Usandopara:
for each in "${alpha[@]}"
do
echo "$each"
done
Usandohistoria; tenga en cuenta que esto fallará si sus valores contienen !
:
history -p "${alpha[@]}"
Usandonombre base; tenga en cuenta que esto fallará si sus valores contienen /
:
basename -a "${alpha[@]}"
Usandoshuf; tenga en cuenta que es posible que los resultados no aparezcan en orden:
shuf -e "${alpha[@]}"