For- und Read-While-Schleifen in Bash

Schleifen, auch bekannt als Entwerfen eines Programms für sich wiederholende Arbeiten für Sie

Die Schleife ist eines der grundlegendsten und leistungsfähigsten Konstrukte in der Datenverarbeitung, da wir so eine Reihe von Befehlen auf einer Liste von Elementen unserer Wahl so oft wiederholen können, wie wir möchten. Ein Großteil des rechnerischen Denkens besteht darin, eine Aufgabe zu übernehmen und auf eine Weise zu lösen, die wiederholt auf alle anderen ähnlichen Aufgaben angewendet werden kann. In der for-Schleife wird der Computer diese sich wiederholende Arbeit ausführen lassen:

Im Gegensatz zu den meisten Codes, die wir bisher an der interaktiven Eingabeaufforderung geschrieben haben, wird eine for-Schleife nicht ausgeführt, sobald wir die Eingabetaste drücken:

Wir können beliebig viele Befehle in den Block zwischen den Schlüsselwörtern do und done schreiben :

Nur bis wir done erreichen und die Eingabetaste drücken, erledigt die for-Schleife ihre Arbeit.

Dies unterscheidet sich grundlegend von den zeilenweisen Befehlen und Antworten, die wir bisher an der Eingabeaufforderung erlebt haben. Und es wird vorausgesagt, wie wir weiter programmieren werden: weniger Nachdruck auf die Ausführung von Befehlen mit jede Zeile und mehr Nachdruck darauf, die Funktionalität eines Programms zu planen und später auszuführen.

Grundlegende Syntax

Die Syntax für for -Schleifen kann verwirrend sein. Hier sind einige grundlegende Beispiele, um Ihr Verständnis davon vorzubereiten / zu aktualisieren:

Hier „ist eine ausführlichere Version unter Verwendung von Variablen:

Eine Befehlssubstitution kann zum Generieren verwendet werden Die Elemente, über die die Schleife for iteriert:

Wenn Sie eine Liste von Zeilen aus a lesen müssen Datei und sind absolut sicher, dass keine der Zeilen ein Leerzeichen enthält:

Eine Leseschleife ist eine Variation der oben genannten, ist es aber Sicherer zum Lesen von Zeilen aus einer Datei:

Erstellen einer Basis für die Schleife

Beginnen wir von einem Anfang mit einem sehr minimale for -Schleife und baute sie dann in etwas Ausgefeilteres ein, um uns zu helfen, ihren Zweck zu verstehen.

Die einfachste Schleife

Das ist ungefähr so einfach wie Sie eine for-Schleife erstellen können:

Schien das ziemlich wertlos? Ja sollte es haben. Ich habe vier Codezeilen geschrieben, um das zu tun, was in einer einzigen Zeile erforderlich ist: echo "Hi".

Weitere Elemente in der Sammlung

Es „ist schwer zu sagen, aber eine“ Schleife „wurde ausgeführt. Sie wurde nur einmal ausgeführt. OK, wie können wir sie also mehr als einmal ausführen lassen? Fügen Sie rechts neben der in Schlüsselwort. Fügen wir vier weitere 1 „s hinzu:

OK, nicht sehr aufregend, aber das Programm schien definitiv mindestens eine Schleife zu haben: Vier 1 „s führten dazu, dass vier echo -Befehle ausgeführt wurden.

Was passiert, wenn wir diese vier 1 „durch unterschiedliche Zahlen ersetzen? Und vielleicht ein paar Wörter?

Und… nichts. Die Schleife macht also nicht automatisch etwas Spezielles für die Sammlung von Werten, die wir ihr gegeben haben. Noch nicht.

Siehe Schleifenvariable

Schauen wir links vom Schlüsselwort in und dann x. Worum geht es bei diesem x? Ein x in Kleinbuchstaben ist nicht der Name eines Schlüsselworts oder Befehls, auf den wir bisher gestoßen sind (und die alleinige Ausführung an der Eingabeaufforderung führt zu einem Fehler). Vielleicht ist es also eine Variable? Versuchen wir, sie in der Anweisung echo zu referenzieren:

Bingo. Dies ist so ziemlich die grundlegende Funktionsweise einer for -Schleife: – Eine Sammlung von Elementen / Werten abrufen (Q Zebra 999 Smithsonian) – Übergeben Sie diese an eine for Schleifenkonstrukt – Verwenden Sie die Schleifenvariable (x) als Platzhalter und schreiben Sie Befehle zwischen do / done Block.- Wenn die Schleife ausgeführt wird, nimmt die Schleifenvariable x den Wert jedes der Elemente in an die Liste – Q, Zebra, 999, Smithsonian, – und der Befehlsblock zwischen do und done wird dann ausgeführt. Diese Sequenz wird für jedes Element in der Liste einmal wiederholt.

Der Block do / done kann eine beliebige Sequenz von enthalten Befehle, sogar eine andere for -Schleife:

Loops-in-Loops sind ein gängiges Konstrukt in der Programmierung.Zum größten Teil werde ich versuchen, Probleme zu vermeiden, die diese Art von Logik beinhalten würden, da es schwierig sein kann, sie während des Debuggens zu lösen.

Lesen Sie eine Datei Zeile für Zeile, zuverlässig mit read-while

Da cat eine Datei zeilenweise druckt, erscheint die folgende for-Schleife sinnvoll:

Die Befehlsersetzung bewirkt jedoch, dass cat Wörter nach Leerzeichen aufteilt. Wenn list-of-dirs.txt das enthält Folgendes:

Die Ausgabe der for -Schleife lautet wie folgt:

Eine Leseschleife behält die Wörter in einer Zeile bei:

Wir können auch aus dem Ergebnis eine Pipe erstellen eines Befehls durch Einschließen in <( und ):

Pipes und Loops

Wenn Sie aus anderen Sprachen kommen, sind Datenströme Ihnen möglicherweise nicht vertraut . Zumindest sind sie für mich, da die Syntax für die Arbeit mit ihnen in Bash viel direkter und unkomplizierter ist als in Ruby oder Python.

Wenn Sie jedoch neu in der Programmierung in einer beliebigen Sprache sind, was könnte das sein? Unklar ist auch, wie sich die Arbeit mit Datenströmen von der Arbeit mit Schleifen unterscheidet.

Zum Beispiel das folgende Snippet:

– erzeugt die gleiche Ausgabe wie diese Schleife:

Und abhängig von Ihrem mentalen Modell der Dinge scheint es, dass in beiden Beispielen jedes Wort, z. B. hello, world wird einem Übersetzungsprozess (über tr) unterzogen und dann wiederholt.

Pipes und Filter

Lassen Sie mich eine mentale Problemumgehung vorschlagen, ohne auf die Grundlagen des Unix-Systems einzugehen, in dem eine Pipe grundlegend anders als eine Schleife funktioniert.

Programme, die von stdin und stdout geleitet werden, können normalerweise als Filter angeordnet werden, in denen ein Datenstrom vorhanden ist geht in ein Programm und kommt in einem anderen Format heraus:

Denken Sie bei Aufgaben, die mehr als nur das Transformieren von Daten von Filter zu Filter sind, an die Verwendung einer Schleife. Was könnte eine Aufgabe sein? Laden Sie bei einer gegebenen Liste von URLs jede herunter und senden Sie die heruntergeladenen Daten per E-Mail mit einem benutzerdefinierten Text und Betreff:

Die Dateneingabequelle, jede URL in urls.txt, wird hier nicht wirklich gefiltert. Stattdessen wird für jede URL eine mehrstufige Aufgabe ausgeführt.

Piping in read-while

Das heißt, eine Schleife selbst kann implementiert werden Nehmen Sie diese Variante der Read-While-Schleife, in der das Ergebnis von echo | grep Zeile für Zeile in die -Schleife, die mit echo in stdout gedruckt wird und in die Datei some.txt umgeleitet wird:

Dies ist kein Konstrukt, das Sie möglicherweise häufig, wenn überhaupt, ausführen müssen, aber es verstärkt hoffentlich die Pipe-Nutzung unter Unix.

Weniger interaktive Programmierung

Die Die häufige Verwendung von for -Schleifen und ähnlichen Konstrukten bedeutet, dass wir die guten alten Tage des Schreibens in einer Zeile von c hinter uns lassen Befehle und die Ausführung direkt nach dem Drücken der Eingabetaste. Unabhängig davon, wie viele Befehle wir in eine for -Schleife packen, geschieht nichts, bis wir das Schlüsselwort done treffen.

Einmal schreiben. Schleife es dann

Mit diesem Verlust der zeilenweisen Interaktion mit der Shell verlieren wir den Hauptvorteil der interaktiven Eingabeaufforderung: sofortiges Feedback. Und wir haben immer noch alle Nachteile: Wenn wir früher im Befehlsblock zwischen do und done einen Tippfehler machen, müssen wir beginnen überall.

So mildern wir das:

Testen Sie Ihren Code fallweise

Einer der größten Fehler, mit denen Anfänger machen for Schleifen glauben, dass eine for -Schleife ihr Problem sofort löst. Wenn sie also 10.000 URLs herunterladen müssen, aber sie kann nicht nur eine URL richtig herunterladen, sie denken, dass das Einfügen ihrer fehlerhaften Befehle in eine for -Schleife ein Schritt in die richtige Richtung ist.

Außerdem ist dies ein grundlegender Schritt Das Missverständnis einer for -Schleife besteht darin, dass Sie Ihren fehlerhaften Code jetzt 10.000 Mal ausführen. Dies bedeutet, dass Sie 10.000 Mal so lange warten müssen, um herauszufinden, ob Ihr Code ist. Leider immer noch kaputt.

Stellen Sie sich also vor, Sie hätten noch nie von for Schleifen. Stellen Sie sich vor, Sie müssen alle 10.000 URLs einzeln herunterladen. Können Sie den Befehl schreiben, dies für die erste URL zu tun? Wie wäre es mit der zweiten? Wenn Sie sich ziemlich sicher sind, dass Sie keine geringfügigen Syntaxfehler auslösen, ist es an der Zeit, darüber nachzudenken, wie Sie ein allgemeines Muster für die 9.997 anderen URLs finden.

Schreiben Sie Skripte

Die interaktive Befehlszeile ist großartig.Am Anfang hat es Spaß gemacht, und es wird während Ihrer gesamten Computerkarriere Spaß machen. Wenn Sie jedoch eine große Aufgabe vor sich haben, die mehr als zehn Codezeilen umfasst, ist es an der Zeit, diesen Code in einen Code einzufügen Shell-Skript. Vertraue deinen fehlbaren menschlichen Fingern nicht, dass sie den Code fehlerfrei erneut eingeben.

Verwenden Sie nano, um Schleifen zu bearbeiten und als Shell zu speichern Skripte. Für längere Dateien arbeite ich am Texteditor meines Computers (Sublime Text) und lade ihn dann auf den Server hoch.

Übung mit Web-Scraping

Nur um das zu erden Syntax und Funktionsweise der for-Schleife, hier ist der Denkprozess von der Umwandlung einer Routineaufgabe in eine Schleife:

Für die Zahlen 1 bis 10, Verwenden Sie curl, um den Wikipedia-Eintrag für jede Nummer herunterzuladen und in einer Datei mit dem Namen „wiki-number-(whatever the number is).html

Die altmodische Methode

Mit nur 10 URLs konnten wir einige Variablen festlegen und dann den Befehl a curl zehnmal kopieren und einfügen, wobei Änderungen an jeder Zeile vorgenommen wurden:

Und weißt du was? Es klappt. Für 10 URLs ist dies keine schlechte Lösung, und es ist erheblich schneller als auf die altmodische Weise (über Ihren Webbrowser).

Reduzieren von Wiederholungen

Auch ohne über eine Schleife nachzudenken, können wir die Wiederholung mithilfe von Variablen reduzieren: Die Basis-URL und der Basis-Dateiname ändern sich nie. Weisen Sie diese Werte also Variablen zu Das kann wiederverwendet werden:

Anwenden der for-Schleife

An dieser Stelle haben wir das Muster so weit vereinfacht, dass wir sehen können, wie wenig sich bei jeder einzelnen Aufgabe ändert. Nachdem wir uns mit der for -Schleife vertraut gemacht haben, können wir sie ohne viel Nachdenken anwenden (wir fügen auch einen Schlafbefehl hinzu, damit wir zwischen Webanforderungen pausieren).

Generieren einer list

In den meisten Situationen ist das Erstellen einer for-Schleife einfach. Es ist die Erstellung der Liste, die harte Arbeit sein kann. Was wäre, wenn wir die Seiten für die Nummern 1 bis 100 sammeln wollten? Das ist eine Menge Tippen.

Aber wenn wir unsere Faulheit diktieren lassen Nach unserem Denken können wir uns vorstellen, dass das Zählen von x nach y eine inhärente Rechenaufgabe ist. Und das ist es, und Unix hat das Dienstprogramm seq dafür:

Generieren einer Liste von Nicht-Zahlen für die Iteration

Viele sich wiederholende Aufgaben Es ist nicht so einfach wie das Zählen von x bis y, und so wird das Problem, wie eine nichtlineare Liste von Elementen erstellt wird. Dies ist im Grunde die Kunst der Datenerfassung und -verwaltung. Aber lassen Sie uns ein einfaches Szenario dafür erstellen uns selbst:

Für zehn der Wörter mit 10 Buchstaben (oder mehr), die mindestens einmal in einer Überschrift auf der aktuellen NYTimes.com-Startseite erscheinen, Rufen Sie die Wiktionary-Seite für dieses Wort ab.

Wir unterteilen diese Aufgabe in zwei Teile:

  1. Rufen Sie eine Liste mit zehn 10 ab + -Buchstaben aus den Überschriften von nytimes.com
  2. Übergeben Sie diese Wörter an unsere for-Schleife

Schritt 1: Verwenden des Dienstprogramms pup (oder des Befehlszeilen-HTML-Parsers von Ihre Wahl):

Schritt 2 (vorausgesetzt, die Variable words wird weitergegeben):

Schauen Sie sich Softwa an re Carpentry ist ein ausgezeichneter Leitfaden für For-Loops in Bash

Leave a Reply

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.