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;
Chris Stryczynski
quelle

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.

ktf
quelle
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.

Kent
quelle
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
... 
Tk421
quelle
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
William Pursell
quelle
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,
Rashok
quelle