La asignación no elimina los caracteres de nueva línea, en realidad es el echo
hacer esto. Simplemente necesita poner comillas alrededor de la cadena para mantener esas nuevas líneas:
echo "$testvar"
Esto le dará el resultado que desea. Vea la siguiente transcripción para una demostración:
pax> cat num1.txt ; x=$(cat num1.txt)
line 1
line 2
pax> echo $x ; echo '===' ; echo "$x"
line 1 line 2
===
line 1
line 2
La razón por la que las nuevas líneas se reemplazan con espacios no tiene que ver exclusivamente con el echo
comando, sino que es una combinación de cosas.
Cuando se le da una línea de comando, la bash
divide en palabras de acuerdo con la documentación de la IFS
variable:
IFS: Separador de campo interno que se utiliza para dividir palabras después de la expansión ... el valor predeterminado es <space><tab><newline>
.
Eso especifica que, de forma predeterminada, cualquiera de esos tres caracteres se puede usar para dividir su comando en palabras individuales. Después de eso, los separadores de palabras desaparecen, todo lo que queda es una lista de palabras.
Combine eso con la echo
documentación (un bash
comando interno), y verá por qué se generan los espacios:
echo [-neE] [arg ...]: Muestra los argumentos , separados por espacios, seguidos de una nueva línea.
Cuando lo usa echo "$x"
, obliga a toda la x
variable a ser una sola palabra de acuerdo con bash
, por lo tanto, no se divide. Puedes ver eso con:
pax> function count {
...> echo $#
...> }
pax> count 1 2 3
3
pax> count a b c d
4
pax> count $x
4
pax> count "$x"
1
Aquí, la count
función simplemente imprime el número de argumentos dados. Las variantes 1 2 3
y lo a b c d
muestran en acción.
Luego lo probamos con las dos variaciones de la x
variable. El uno sin citas muestra que hay cuatro palabras, "test"
, "1"
, "test"
y "2"
. Agregar las comillas lo convierte en una sola palabra "test 1\ntest 2"
.