Wie schreibe ich eine mehrzeilige Zeichenfolge mit Bash mit Variablen?


232

Wie kann ich mehrere Zeilen in eine Datei schreiben, die myconfig.confmit BASH aufgerufen wird?

#!/bin/bash
kernel="2.6.39";
distro="xyz";

echo <<< EOL
line 1, ${kernel}
line 2,
line 3, ${distro}
line 4
line ...
EOL >> /etc/myconfig.conf;
cat /etc/myconfig.conf;

Antworten:


470

Die Syntax ( <<<) und der verwendete Befehl ( echo) sind falsch.

Richtig wäre:

#!/bin/bash

kernel="2.6.39"
distro="xyz"
cat >/etc/myconfig.conf <<EOL
line 1, ${kernel}
line 2, 
line 3, ${distro}
line 4 line
... 
EOL

cat /etc/myconfig.conf

Diese Konstruktion wird als Here-Dokument bezeichnet und befindet sich in den Bash-Manpages unter man --pager='less -p "\s*Here Documents"' bash.


49
und wenn Sie anhängen möchten, wäre es Katze >>
oder Gal

19
Dies funktioniert hervorragend, aber Sie müssen sicherstellen, dass vor dem Abschluss kein Leerzeichen steht EOF, da es sonst nicht erkannt wird und ein unerwarteter Fehler am Ende der Datei auftritt.
Nwinkler

10
@StevenEckhoff Dies wird als Heredoc bezeichnet.
William Pursell

4
Was ist, wenn ich eine Sudo-Berechtigung benötige, um in die Datei zu schreiben?
Gfpacheco

14
@gfpacheco Dafür kannst du Tee verwenden, wie cat << EOL | sudo tee /etc/myconfig.conf
Xin Chen

74
#!/bin/bash
kernel="2.6.39";
distro="xyz";

cat > /etc/myconfig.conf << EOL
line 1, ${kernel}
line 2,
line 3, ${distro}
line 4
line ...
EOL

das macht was du willst.


6
@ktf Ich habe nicht schneller getippt, aber weniger Buchstaben als du. ^ _ *
Kent

35

Wenn Sie nicht möchten, dass Variablen ersetzt werden, müssen Sie EOL in einfache Anführungszeichen setzen.

cat >/tmp/myconfig.conf <<'EOL'
line 1, ${kernel}
line 2, 
line 3, ${distro}
line 4 line
... 
EOL

Vorheriges Beispiel:

$ cat /tmp/myconfig.conf 
line 1, ${kernel}
line 2, 
line 3, ${distro}
line 4 line
... 

14

Die Heredoc-Lösungen sind sicherlich der häufigste Weg, dies zu tun. Andere gängige Lösungen sind:

Echo 'Zeile 1,' "$ {Kernel}" '
Zeile 2,
Zeile 3, '"$ {distro}"'
Zeile 4 '> /etc/myconfig.conf

und

exec 3> & 1 # Aktuelle Standardausgabe speichern
exec> /etc/myconfig.conf
Echo Zeile 1, $ {Kernel}
Echolinie 2, 
Echo Zeile 3, $ {Distribution}
...
exec 1> & 3 # Stdout wiederherstellen

Vielleicht auch darauf hinweisen, printfwas noch einige weitere interessante Variationen einführt.
Tripleee

3

Der folgende Mechanismus hilft beim Umleiten mehrerer Zeilen in eine Datei. Behalten Sie die vollständige Zeichenfolge unter, "damit wir die Werte der Variablen umleiten können.

#!/bin/bash
kernel="2.6.39"
echo "line 1, ${kernel}
line 2," > a.txt
echo 'line 2, ${kernel}
line 2,' > b.txt

Inhalt von a.txtist

line 1, 2.6.39
line 2,

Inhalt von b.txtist

line 2, ${kernel}
line 2,
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.