Wenn Sie Bash-Skripte schreiben, befinden Sie sich manchmal in Situationen, in denen Sie eine Datei Zeile für Zeile lesen müssen. Sie können beispielsweise eine Textdatei mit Daten haben, die vom Skript verarbeitet werden sollen.

In diesem Tutorial erfahren Sie, wie Sie eine Datei Zeile für Zeile in Bash lesen.,

Zeilenweise Lesen einer Datei Syntax #

Die allgemeinste Syntax zum zeilenweisen Lesen einer Datei lautet wie folgt:

while IFS= read -r line; do printf '%s\n' "$line"done < input_file

oder die entsprechende einzeilige Version:

while IFS= read -r line; do printf '%s\n' "$line"; done < input_file

Wie funktioniert das?

Die Eingabedatei (input_file) ist der Name der Datei, die in die while-Schleife umgeleitet wird. Der Befehl read verarbeitet die Datei zeilenweise und weist jede Zeile der Variablen line zu. Sobald alle Zeilen verarbeitet sind, wird die while-Schleife beendet.,

Standardmäßig interpretiert der Befehl read den Backslash als Escape-Zeichen und entfernt alle führenden und nachfolgenden Leerzeichen, was manchmal zu unerwartetem Verhalten führen kann. Um das Backslash-Escaping zu deaktivieren, rufen wir den Befehl mit der Option -r auf, und um das Trimmen zu deaktivieren, wird das interne Feldtrennzeichen (IFS) gelöscht.

Wir verwenden anstelle von echo, um den Code portabler zu machen und unerwünschtes Verhalten zu vermeiden., Wenn die Zeile beispielsweise Werte wie „-e“ enthält, wird sie als Echo-Option behandelt.

Lesen einer Datei zeilenweise Beispiele #

Schauen wir uns das folgende Beispiel an. Angenommen, wir haben eine Datei mit dem Namen distros.txt, die eine Liste einiger der beliebtesten Linux-Distributionen enthält, und deren Paketmanager sind durch Komma getrennt (,):

Distributionen.,txt
Ubuntu,aptDebian,aptCentOS,yumArch Linux,pacmanFedora,dnf

Um die Datei Zeile für Zeile zu lesen, würden Sie den folgenden Code in Ihrem Terminal ausführen:

while IFS= read -r line; do printf '%s\n' "$line"done < distros.txt

Der Code liest die Datei zeilenweise, weist jede Zeile einer Variablen zu und druckt sie aus. Grundsätzlich würden Sie die gleiche Ausgabe sehen, als würden Sie den Dateiinhalt mit dem Befehl cat anzeigen.

Was ist, wenn Sie nur die Distributionen drucken möchten, die apt verwenden?, Eine Möglichkeit wäre, die Anweisung if zu verwenden und zu überprüfen, ob die Zeile den folgenden Teilstring enthält :

while IFS= read -r line; do if ]; then printf '%s\n' "$line" fidone < distros.txt
Ubuntu,aptDebian,apt

Wenn Sie eine Datei Zeile für Zeile lesen, können Sie auch mehr als eine Variable an den Befehl read übergeben, der die Zeile in felder basierend auf IFS. Das erste Feld wird der ersten Variablen, das zweite der zweiten Variablen usw. zugewiesen. Wenn mehr Felder als Variablen vorhanden sind, werden die übrig gebliebenen Felder der letzten Variablen zugewiesen.,

Im folgenden Beispiel setzen wir IFS auf ein Komma (,) und übergeben zwei Variablen distro und pm an den Befehl read.,erything vom Anfang der Zeile bis zum ersten Komma wird der ersten Variablen zugewiesen (distro), und der Rest der Zeile wird der zweiten Variablen zugewiesen (pm):

while IFS=, read -r distro pm; do printf '%s is the package manager for %s\n' "$pm" "$distro"done < distros.txt
apt is the package manager for Ubuntuapt is the package manager for Debianyum is the package manager for CentOSpacman is the package manager for Arch Linuxdnf is the package manager for Fedora

Alternative Dateilesemethoden #

Mit einem Prozess Substitution #

Prozess Substitution ist eine Funktion, die Sie die Ausgabe von Befehl als Datei verwenden können:

while IFS= read -r line; do printf '%s\n' "$line"done < <(cat input_file )

Mit einem Hier String #

Hier String ist eine Variante von Hier Dokument ., Die Zeichenfolge (cat input_file ) behält die Zeilenumbrüche bei:

while IFS= read -r line; do printf '%s\n' "$line"done <<< $(cat input_file )

Mit dem Dateideskriptor #

können Sie die Eingabe auch mithilfe eines Dateideskriptors für die Schleife bereitstellen:

while IFS= read -r -u9 line; do printf '%s\n' "$line"done 9< input_file

Verwenden Sie bei der Arbeit mit Dateideskriptoren eine Zahl zwischen 4 und 9 um Konflikte mit Shell-internen Dateideskriptoren zu vermeiden.

In Bash können wir eine Datei Zeile für Zeile mit einer while-Schleife und dem Befehl read.