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
?
50
Aquí hay una manera que utiliza la expansión de parámetros bash y su IFS
variable especial.
$ System=('s1' 's2' 's3' 's4 4 4')
$ ( IFS=$'\n'; echo "${System[*]}" )
Usamos un subshell para evitar sobrescribir el valor de IFS
en el entorno actual. En ese subshell, modificamos el valor de IFS
modo 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 personaje de IFS
.
Para capturar a una variable:
$ var=$( IFS=$'\n'; echo "${System[*]}" )
Si su bash es lo suficientemente nuevo (4.2 o posterior), aún puede (y debería) 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 var
. Para eliminarlo:
$ var=${var%?} # Remove the final character of var
var=${var%?}
? Esta no es una expresión regular, por.
lo que solo coincidirá con un carácter de punto.$ IFS=', ' $ echo ${VAR[*]} first second third $ echo "${VAR[*]}" first,second,third
Puede usar
printf
para imprimir cada elemento de la matriz en su propia línea:fuente
o
o
o
o
o
o
o
eso es todo lo que puedo recordar hasta ahora.
fuente
Las soluciones anteriores son más o menos eso, pero la pregunta original pide resultados para archivar:
Notas: 1) 'echo' proporciona la nueva línea final 2) Si bash vuelve a leer este archivo nuevamente, entonces declare -p puede ser la serialización deseada.
fuente
Utilizando para :
Usando la historia ; tenga en cuenta que esto fallará si sus valores contienen
!
:Usando basename ; tenga en cuenta que esto fallará si sus valores contienen
/
:Usando shuf ; tenga en cuenta que los resultados pueden no aparecer en orden:
fuente
Mi opinión , usando solo Bash Builtins, sin mutar
IFS
:Ejemplo
También puedes usar cualquier separador:
fuente
printf
parece ser el enfoque más eficiente para crear una cadena delimitada a partir de una matriz:Una forma aún más simple de hacer esto es:
Ejemplo
fuente