El script de Shell repite una nueva línea para presentar

26

Quiero hacer eco de una nueva línea a un archivo entre variables en un script de shell. Aquí está mi código:

var1 = "Hola"
var2 = "Mundo!"
logwrite = "$ var1 [Aquí es donde quiero insertar una nueva línea] $ var2
echo "$ logwrite" >> /Users/username/Desktop/user.txt

En este momento, cuando ejecuto mi script, el archivo user.txt muestra esto:

Hola Mundo!

Quiero que muestre:

Hola
¡Mundo!

¿¿Cómo hago esto??

EDITAR: Aquí está mi script de shell:

echo -n "¿Cuál es tu nombre de pila?"
Lee primero
echo -n "¿Cuál es tu apellido?"
leer el último
echo -n "¿Cuál es tu segundo nombre?"
leer medio
echo -n "¿Cuál es tu cumpleaños?"
leer cumpleaños
echo -e "Nombre: $ nombre / n Apellido: $ apellido / nNombre intermedio: $ nombre medio / nCumpleaños: $ cumpleaños" >> /Users/matthewdavies/Desktop/user.txt
qlmanage -p "~ / Desktop / user.txt"
daviesgeek
fuente
1
¿NECESITA crear esta variable "logwrite"? Se puede escribir printf "%s\n" $var1 $var2 >> file?
Glenn Jackman
No, no lo necesito y en mi script revisado en el que he estado trabajando, no uso la variable $ logwrite. Gracias.
daviesgeek

Respuestas:

32
var1="Hello"
var2="World!"
logwrite="$var1\n$var2"
echo -e "$logwrite"  >> /Users/username/Desktop/user.txt

Explicación:

La \nsecuencia de escape indica un avance de línea. Pasar el -eargumento a echo permite la interpretación de secuencias de escape.

Incluso puede simplificarse aún más:

var1="Hello"
var2="World!"
echo -e "$var1\n$var2"  >> /Users/username/Desktop/user.txt

o incluso:

echo -e "Hello\nWorld! "  >> /Users/username/Desktop/user.txt
John T
fuente
Su ejemplo funciona, pero cuando lo incorporo a mi código, no funciona. Editaré mi publicación y agregaré mi script en ella.
daviesgeek
1
@dave parece que está usando la barra incorrecta con la secuencia de escape. \nen lugar de /ndebería hacer el truco :)
John T
Eso lo soluciona (usando \ n en lugar de / n. ¡Muchas gracias!)
daviesgeek
@dave, eres más que bienvenido :)
John T
en AIX en el script KSH no requería la -ebandera.
javaPlease42
5
var1='Hello'
var2='World!'
echo "$var1" >> /Users/username/Desktop/user.txt
echo "$var2" >> /Users/username/Desktop/user.txt

o en realidad no necesitas vars:

echo 'Hello' >> /Users/username/Desktop/user.txt
echo 'World!' >> /Users/username/Desktop/user.txt

hay un problema con la respuesta de john t: si alguno de los vars tenía la cadena \ n (o alguna otra secuencia como \ t) se traducirán. uno puede obtener algo similar a su respuesta con printf:

printf '%s\n%s\n' 'Hello' 'World!'

También hmm. veo que estás componiendo la respuesta en una variable $ logwrite. Si este es el único uso de esta variable, parece inútil.

Creo que un documento aquí podría ser más legible, especialmente si tiene muchas líneas para agregar al registro:

cat >> /Users/username/Desktop/user.txt <<EOF
Hello
World
EOF

(esta palabra, EOF, es un delimitador que puede elegir. Puede ser cualquier palabra).

tenga en cuenta que el heredoc expandirá las variables $, como las comillas dobles. si no quieres esto, cita el heredoc, como << "EOF"

elias
fuente
la cosa es que ninguno de los vars tiene \n, de ahí por qué proporcioné la respuesta. La metodología "qué pasaría si" llevaría cada pregunta en este sitio a una discusión interminable. Cuando llega a ese camino, puede hacer otra pregunta :)
John T
@elias, la variable $ logwrite quedó de mis ediciones en el script cuando estaba haciendo cambios. Tomé el $ logwrite var de mi código. La respuesta de John T. realmente funcionó. ¡Muchas gracias!
daviesgeek
Si, uso printf. Es POSIX: stackoverflow.com/a/34947759/895245
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件