Bash
Hier Dokumente und hier Zeichenketten
Suche…
Einrücken von Dokumenten hier
Sie können den Text in den hier enthaltenen Dokumenten mit Registerkarten einrücken. Sie müssen den <<-
Umleitungsoperator anstelle von <<
:
$ cat <<- EOF
This is some content indented with tabs `\t`.
You cannot indent with spaces you __have__ to use tabs.
Bash will remove empty space before these lines.
__Note__: Be sure to replace spaces with tabs when copying this example.
EOF
This is some content indented with tabs _\t_.
You cannot indent with spaces you __have__ to use tabs.
Bash will remove empty space before these lines.
__Note__: Be sure to replace spaces with tabs when copying this example.
Ein praktischer Anwendungsfall (wie in man bash
) sind Shell-Skripte, zum Beispiel:
if cond; then
cat <<- EOF
hello
there
EOF
fi
Es ist üblich, die Zeilen innerhalb der Codeblöcke wie in dieser if
-Anweisung einzurücken, um die Lesbarkeit zu verbessern. Ohne die <<-
Operator-Syntax würden wir den obigen Code wie folgt schreiben:
if cond; then
cat << EOF
hello
there
EOF
fi
Das ist sehr unangenehm zu lesen und wird in einem komplexeren realistischen Skript viel schlimmer.
Hier Zeichenketten
Sie können einen Befehl mit folgenden Zeichenfolgen eingeben:
$ awk '{print $2}' <<< "hello world - how are you?"
world
$ awk '{print $1}' <<< "hello how are you
> she is fine"
hello
she
Sie können eine while
Schleife auch mit einem Here-String füttern:
$ while IFS=" " read -r word1 word2 rest
> do
> echo "$word1"
> done <<< "hello how are you - i am fine"
hello
Zeichenketten begrenzen
Ein Heredoc verwendet die Begrenzungszeichenfolge , um zu bestimmen, wann aufgehört wird , Eingaben zu verbrauchen. Die Abschlussbegrenzung muss
- Sei am Anfang einer Zeile.
- Seien Sie der einzige Text in der Zeile Hinweis: Wenn Sie
<<-
verwenden, können Tabulatoren\t
der Begrenzungszeichenfolge vorangestellt werden
Richtig:
cat <<limitstring
line 1
line 2
limitstring
Dies wird ausgegeben:
line 1 line 2
Falsche Verwendung:
cat <<limitstring
line 1
line 2
limitstring
Da sich limitstring
in der letzten Zeile nicht genau am Zeilenanfang befindet, wartet die Shell weiter auf weitere Eingaben, bis sie eine Zeile sieht, die mit limitstring
beginnt und nichts anderes enthält. Erst dann wird auf Eingaben gewartet und das Here-Dokument an den cat
Befehl übergeben.
Wenn Sie dem anfänglichen Grenzwertstring einen Bindestrich voranstellen, werden alle Tabulatoren am Zeilenanfang vor der Analyse entfernt, sodass die Daten und der Grenzwertstring mit Tabulatoren eingerückt werden können (zum leichteren Lesen in Shell-Skripts).
cat <<-limitstring
line 1 has a tab each before the words line and has
line 2 has two leading tabs
limitstring
wird herstellen
line 1 has a tab each before the words line and has line 2 has two leading tabs
wobei die führenden Tabs (aber nicht die internen Tabs) entfernt wurden.
Erstellen Sie eine Datei
Eine klassische Verwendung dieser Dokumente besteht darin, eine Datei durch Eingabe ihres Inhalts zu erstellen:
cat > fruits.txt << EOF
apple
orange
lemon
EOF
Das Here-Dokument enthält die Zeilen zwischen << EOF
und EOF
.
Dieses Dokument wird zur Eingabe des cat
Befehls. Der Befehl cat
gibt einfach seine Eingabe aus, und mit dem Operator für die Umleitung von Ausgaben >
wir zu einer Datei fruits.txt
umgeleitet.
Als Ergebnis enthält die fruits.txt
Datei die Zeilen:
apple
orange
lemon
Es gelten die üblichen Regeln für die Ausgabeumleitung: Wenn fruits.txt
noch nicht vorhanden war, wird sie erstellt. Wenn es vorher existiert hat, wird es abgeschnitten.
Befehl mit diesem Dokument ausführen
ssh -p 21 [email protected] <<EOF
echo 'printing pwd'
echo "\$(pwd)"
ls -a
find '*.txt'
EOF
$
wird mit Escapezeichen versehen, weil wir nicht möchten, dass es durch die aktuelle Shell erweitert wird, dh, $(pwd)
wird auf der Remote-Shell ausgeführt.
Ein anderer Weg:
ssh -p 21 [email protected] <<'EOF'
echo 'printing pwd'
echo "$(pwd)"
ls -a
find '*.txt'
EOF
Hinweis : Das schließende EOF sollte am Anfang der Zeile stehen (vorher keine Leerzeichen). Wenn eine Einrückung erforderlich ist, können Registerkarten verwendet werden, wenn Sie Ihr Heredoc mit <<-
. Siehe die Einrücken hier Dokumente und Limit - Strings Beispiele für weitere Informationen.
Führen Sie mehrere Befehle mit Sudo aus
sudo -s <<EOF
a='var'
echo 'Running serveral commands with sudo'
mktemp -d
echo "\$a"
EOF
-
$a
muss mit Escapezeichen versehen werden, um zu verhindern, dass es von der aktuellen Shell erweitert wird
Oder
sudo -s <<'EOF'
a='var'
echo 'Running serveral commands with sudo'
mktemp -d
echo "$a"
EOF