Shell-Skript gibt neue Zeile in Datei aus

26

Ich möchte eine neue Zeile in eine Datei zwischen Variablen in einem Shell-Skript einfügen. Hier ist mein Code:

var1 = "Hallo"
var2 = "Welt!"
logwrite = "$ var1 [Hier möchte ich eine neue Zeile einfügen] $ var2
Geben Sie "$ logwrite" >> /Users/username/Desktop/user.txt als Echo ein

Im Moment, wenn ich mein Skript ausführe, zeigt die Datei user.txt Folgendes:

Hallo Welt!

Ich möchte, dass es zeigt:

Hallo
Welt!

Wie mache ich das??

EDIT: Hier ist mein Shell-Skript:

echo -n "Wie lautet Ihr Vorname?"
zuerst lesen
echo -n "Wie ist dein Nachname?"
zuletzt gelesen
echo -n "Wie lautet Ihr zweiter Vorname?"
Lesen Sie in der Mitte
echo -n "Was ist dein Geburtstag?"
Geburtstag lesen
echo -e "Vorname: $ first / nLast Name: $ last / nMiddle Name: $ middle / nGeburtstag: $ birthday" >> /Users/matthewdavies/Desktop/user.txt
qlmanage -p "~ / Desktop / user.txt"
Daviesgeek
quelle
1
MÜSSEN Sie diese "Logwrite" -Variable erstellen? Können Sie schreiben printf "%s\n" $var1 $var2 >> file?
Glenn Jackman
Nein, ich muss nicht und verwende in meinem überarbeiteten Skript, an dem ich gearbeitet habe, nicht die Variable $ logwrite. Vielen Dank.
Daviesgeek

Antworten:

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

Erläuterung:

Die \nEscape-Sequenz zeigt einen Zeilenvorschub an. Wenn Sie das -eArgument an echo übergeben, können Sie die Escape-Sequenzen interpretieren.

Es kann sogar noch weiter vereinfacht werden:

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

oder auch:

echo -e "Hello\nWorld! "  >> /Users/username/Desktop/user.txt
John T
quelle
Ihr Beispiel funktioniert, aber wenn ich es in meinen Code einbinde, funktioniert es nicht. Ich bearbeite meinen Beitrag und füge mein Skript hinzu.
Daviesgeek
1
@dave es scheint, dass Sie den falschen Schrägstrich mit der Escape-Sequenz verwenden. \nanstatt /nsollte den Trick machen :)
John T
Das behebt es (mit \ n anstelle von / n. Vielen Dank !!
Daviesgeek
@ Dave, du bist mehr als willkommen :)
John T
Unter AIX im KSH-Skript benötigte ich das -eFlag nicht.
JavaPlease42
5
var1='Hello'
var2='World!'
echo "$var1" >> /Users/username/Desktop/user.txt
echo "$var2" >> /Users/username/Desktop/user.txt

oder eigentlich brauchst du keine vars:

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

Es gibt ein Problem mit der Antwort von John T. Wenn einer der Vars den String \ n (oder eine andere Sequenz wie \ t) hatte, werden sie übersetzt. man kann etwas ähnliches wie seine Antwort mit printf bekommen:

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

auch hmm. Ich sehe, dass Sie die Antwort in eine Variable $ logwrite komponieren. Wenn dies die einzige Verwendung dieser Variablen ist, erscheint sie sinnlos.

Ich denke, ein Here-Doc könnte besser lesbar sein, insbesondere wenn Sie viele Zeilen an das Protokoll anhängen müssen:

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

(Dieses Wort, EOF, ist ein Trennzeichen, das Sie auswählen können. Es kann ein beliebiges Wort sein.)

Beachten Sie, dass der Heredoc $ -Variablen wie doppelte Anführungszeichen erweitert. wenn du das nicht willst, zitierst du den Heredoc, wie << "EOF"

elias
quelle
Die Sache ist, dass keiner der Vars hat \n, daher habe ich die Antwort geliefert. Die "Was wäre, wenn" -Methode würde jede Frage auf dieser Website in eine endlose Diskussion führen. Wenn er zu dieser Straße kommt, kann er eine andere Frage stellen :)
John T
@elias Die Variable $ logwrite war von meinen Änderungen im Skript übrig geblieben, als ich Änderungen vornahm. Ich habe die Variable $ logwrite aus meinem Code entfernt. Die Antwort von John T. hat tatsächlich funktioniert. Vielen Dank!
Daviesgeek
Ja, benutze printf. Es ist POSIX: stackoverflow.com/a/34947759/895245
Ciro Santilli Am