Der cat <<EOF
Syntax ist sehr nützlich, wenn Sie mit mehrzeiligem Text in Bash arbeiten, z. beim Zuweisen eines mehrzeiligen Strings zu einer Shell-Variablen, einer Datei oder einer Pipe.
Beispiele für cat <<EOF
Syntaxverwendung in Bash:
1. Einer Shell-Variablen mehrzeiligen String zuweisen
$ sql=$(cat <<EOF
SELECT foo, bar FROM db
WHERE foo='baz'
EOF
)
Die $sql
Die Variable enthält jetzt auch die Zeilenumbrüche. Sie können sich mit echo -e "$sql"
verifizieren .
2. Übergeben Sie eine mehrzeilige Zeichenfolge an eine Datei in Bash
$ cat <<EOF > print.sh
#!/bin/bash
echo \$PWD
echo $PWD
EOF
Die print.sh
Datei enthält jetzt:
#!/bin/bash
echo $PWD
echo /home/user
3. Übergeben Sie einen mehrzeiligen String an eine Pipe in Bash
$ cat <<EOF | grep 'b' | tee b.txt
foo
bar
baz
EOF
Die b.txt
Datei enthält bar
und baz
Linien. Die gleiche Ausgabe wird an stdout
ausgegeben .
Dies wird Heredoc genannt format, um eine Zeichenfolge in stdin bereitzustellen. Siehe https://en.wikipedia.org/wiki/Here_document#Unix_shells für weitere Details.
Ab man bash
:
Hier Dokumente
Diese Art der Umleitung weist die Shell an, Eingaben aus der aktuellen Quelle zu lesen, bis eine Zeile zu sehen ist, die nur ein Wort (ohne nachgestellte Leerzeichen) enthält.
Alle bis dahin gelesenen Zeilen werden dann als Standardeingabe für einen Befehl verwendet.
Das Format von Here-Dokumenten ist:
<<[-]word
here-document
delimiter
Für word wird keine Parametererweiterung, Befehlsersetzung, arithmetische Erweiterung oder Pfadnamenerweiterung durchgeführt . Wenn irgendwelche Zeichen in word in Anführungszeichen gesetzt, das Trennzeichen ist das Ergebnis der Zitatentfernung bei word , und die Zeilen im hier-Dokument werden nicht erweitert. Wenn word ohne Anführungszeichen, alle Zeilen des hier-Dokuments Parametererweiterung, Befehlssubstitution und Arithmetikerweiterung unterzogen. Im letzteren Fall die Zeichenfolge \<newline>
isignored und \
muss verwendet werden, um die Zeichen \
in Anführungszeichen zu setzen , $
, und `
.
Wenn der Umleitungsoperator <<-
ist , dann werden alle führenden Tabulatorzeichen aus den Eingabezeilen und der Zeile mit Trennzeichen entfernt . Dadurch können Here-Dokumente innerhalb von Shell-Skripten auf natürliche Weise eingerückt werden.
In Ihrem Fall ist "EOF" als "Here Tag" bekannt. Grundsätzlich <<Here
teilt der Shell mit, dass Sie eine mehrzeilige Zeichenfolge bis zum "Tag" Here
eingeben werden . Sie können dieses Tag beliebig benennen, oft ist es EOF
oder STOP
.
Einige Regeln zu den Here-Tags:
- Das Tag kann ein beliebiger String sein, Groß- oder Kleinbuchstaben, obwohl die meisten Leute per Konvention Großbuchstaben verwenden.
- Das Tag wird nicht als Here-Tag betrachtet, wenn sich andere Wörter in dieser Zeile befinden. In diesem Fall wird es lediglich als Teil der Zeichenfolge betrachtet. Das Tag sollte allein in einer separaten Zeile stehen, um als Tag betrachtet zu werden.
- Das Tag sollte keine führenden oder abschließenden Leerzeichen in dieser Zeile haben, um als Tag betrachtet zu werden. Andernfalls wird es als Teil des Strings betrachtet.
Beispiel:
$ cat >> test <<HERE
> Hello world HERE <-- Not by itself on a separate line -> not considered end of string
> This is a test
> HERE <-- Leading space, so not considered end of string
> and a new line
> HERE <-- Now we have the end of the string