Bash-Skripte sind ein hocheffizientes Mittel zur Automatisierung von Aufgaben, insbesondere von Aufgaben, die andere vorhandene Programme nutzen. Diese Automatisierung erfordert oft, dass ein ähnlicher Vorgang mehrmals wiederholt wird, genau dort, wo die for-Schleife kommt zur Geltung.

Linux- und Mac-Systemadministratoren sind normalerweise mit Skripten über das Terminal vertraut, aber auch Windows-Benutzer können dies Machen Sie mit dem Windows-Subsystem für Linux mit.

So erhalten Sie die Linux Bash Shell unter Windows 10

Müssen Sie Linux ohne Zeit verwenden, um zu einem anderen PC zu wechseln oder eine VM auszuführen? Führen Sie Linux in Windows 10 stattdessen mit einem Bash-Shell-Terminal aus!

So funktionieren Bash-Skripte

Ein Bash-Skript ist einfach eine Nur-Text-Datei, die eine Reihe von Befehlen enthält, die die Bash-Shell lesen und ausführen kann. Bash ist die Standard-Shell in MacOS vor Catalina und den meisten Linux-Distributionen.

Wenn Sie noch nie mit einem Shell-Skript gearbeitet haben, sollten Sie mit dem einfachsten Fall beginnen. Auf diese Weise können Sie Schlüsselkonzepte üben, einschließlich der Erstellung des Skripts und seiner Ausführung.

instagram viewer

Erstellen Sie zunächst die folgende Datei an einem geeigneten Ort (im Idealfall öffnen Sie ein Terminal und navigieren Sie zuerst zum gewünschten Verzeichnis):

#! / bin / bash
Echo "Hallo Welt"

In der ersten Zeile wird angegeben, wie dieses Programm ausgeführt wird (d. H. Mit dem Bash-Interpreter). Der zweite ist nur ein Befehl wie jeder andere, den Sie in die Befehlszeile eingeben können. Speichern Sie diese Datei als hello_world.sh, dann:

$ chmod + x hello_world.sh
$ ./hello_world.sh

Das chmod Der Befehl in der ersten Zeile macht die Datei ausführbar, was bedeutet, dass sie wie in der zweiten Zeile durch Eingabe ihres Namens ausgeführt werden kann.

Wenn die Wörter "Hallo Welt" in einer Zeile in Ihrem Terminal angezeigt werden, funktioniert alles wie erforderlich.

So funktionieren For-Loops

Bei der allgemeinen Programmierung gibt es zwei Haupttypen von for-Schleifen: numerisch und für jedes. Der numerische Typ ist traditionell der gebräuchlichste, aber bei der Verwendung von Bash ist er normalerweise umgekehrt.

Numerische for-Schleifen konzentrieren sich normalerweise auf eine einzelne Ganzzahl, die bestimmt, wie viele Iterationen ausgeführt werden, zum Beispiel:

für (i = 0; i <100; i ++) {
/ * Anweisungen, die wiederholt ausgeführt werden sollen * /
}

Dies ist eine vertraute for-Schleife, die genau 100 Mal iteriert, es sei denn, i wird innerhalb der Schleife geändert oder eine andere Anweisung bewirkt, dass die Ausführung der for-Schleife angehalten wird.

Im Gegensatz dazu arbeiten Foreach-Schleifen in der Regel mit Strukturen wie Listen oder Arrays und iterieren für jedes Element in dieser Sammlung:

Menschen = ["Peter", "Paul", "Mary"]
foreach (Menschen als Person) {
if (person == "Paul") {
...
}
}

Einige Sprachen verwenden eine etwas andere Syntax, die die Reihenfolge der Sammlung und des Elements vertauscht:

Menschen = ["Peter", "Paul", "Mary"]
für (Person in Menschen) {
if (person == "Paul") {
...
}
}

Für in Schleifen

In Bash, der Foreach - oder für in- Schleife ist häufiger. Die grundlegende Syntax lautet einfach:

für arg in [Liste]
machen
/ * Anweisungen, die wiederholt ausgeführt werden sollen * /
/ * Der Wert von arg kann mit $ arg * / ermittelt werden
getan

So durchlaufen Sie beispielsweise drei explizit benannte Dateien:

für Datei in one.c two.c three.c
machen
ls "$ file"
getan

Wenn solche Dateien im aktuellen Verzeichnis vorhanden sind, lautet die Ausgabe dieses Skripts:

one.c
zwei.c
drei.c

Anstelle eines festen Satzes von Dateien kann die Liste über ein Glob-Muster abgerufen werden (eines mit Platzhaltern - Sonderzeichen, die andere Zeichen darstellen). Im folgenden Beispiel durchläuft die for-Schleife alle Dateien (im aktuellen Verzeichnis), deren Namen mit ".xml" enden:

für Datei in * .xml
machen
ls -l "$ file"
getan

Hier einige Beispielausgaben:

$ -rw-r - r-- 1 Bobby-Mitarbeiter 2436 3. November 2019 feed.xml
$ -rw-r - r-- 1 Bobby Staff 6447 27 Okt 16:24 sitemap.xml

Dies mag sehr nach einer langwierigen Vorgehensweise aussehen:

$ ls -l * .xml

Es gibt jedoch einen signifikanten Unterschied: Die for-Schleife führt die aus ls Programm 2 verschiedene Male, wobei jedes Mal ein einzelner Dateiname übergeben wird. Im separaten ls-Beispiel stimmt das Glob-Muster (* .xml) zuerst mit den Dateinamen überein und sendet dann alle als einzelne Befehlszeilenparameter an eine Instanz von ls.

Hier ist ein Beispiel, das das verwendet Toilette (Wortanzahl) Programm, um den Unterschied deutlicher zu machen:

$ wc -l * .xml
44 feed.xml
231 sitemap.xml
275 insgesamt

Das Toilette Das Programm zählt die Anzahl der Zeilen in jeder Datei separat und druckt dann eine Gesamtanzahl über alle Zeilen. Im Gegensatz dazu, wenn Toilette arbeitet innerhalb einer for-Schleife:

für Datei in * .xml
machen
wc -l $ Datei
getan

Sie sehen immer noch die Anzahl für jede Datei:

44 feed.xml
231 sitemap.xml

Aber es gibt keine Gesamtsumme, weil Toilette wird jedes Mal isoliert ausgeführt, wenn die Schleife wiederholt wird.

Wenn eine Liste keine Liste ist

Es gibt einen sehr einfachen und häufigen Fehler beim Umgang mit for-Schleifen, da bash mit Argumenten / Zeichenfolgen in Anführungszeichen umgeht. Das Durchlaufen einer Liste von Dateien sollte folgendermaßen erfolgen:

für Datei in one.c two.c

So nicht:

für Datei in "one.c two.c"

Das zweite Beispiel enthält Dateinamen in doppelten Anführungszeichen, was zu einer Liste mit nur einem einzigen Parameter führt. Die for-Schleife wird nur einmal ausgeführt. Dieses Problem kann durch die Verwendung einer Variablen in folgenden Fällen vermieden werden:

FILES = "one.c two.c"
für Datei in $ FILES
machen
...
getan

Beachten Sie, dass die Variablendeklaration selbst ihren Wert in doppelte Anführungszeichen setzen muss!

Für ohne Liste

Da nichts durchlaufen werden muss, verarbeitet eine for-Schleife alle Befehlszeilenargumente, die dem Skript beim Aufrufen zur Verfügung gestellt wurden. Zum Beispiel, wenn Sie ein Skript mit dem Namen haben args.sh enthält Folgendes:

#! / bin / sh
Für ein
machen
echo $ a
getan

Wenn Sie dann args.sh ausführen, erhalten Sie Folgendes:

$ ./args.sh eins zwei drei
einer
zwei
drei

Bash erkennt diesen Fall und behandelt für ein do als das Äquivalent von für ein in $ @ do Dabei ist $ @ eine spezielle Variable, die Befehlszeilenargumente darstellt.

Emulieren einer traditionellen numerischen For-Schleife

Bash-Skripte verarbeiten häufig Listen von Dateien oder Ausgabezeilen von anderen Befehlen, daher ist die Schleife vom Typ for in üblich. Die traditionelle Operation im C-Stil wird jedoch weiterhin unterstützt:

für ((i = 1; i <= 5; i ++))
machen
echo $ i
getan

Dies ist die klassische Form mit drei Teilen, in denen:

  1. Eine Variable wird initialisiert (i = 1), wenn die Schleife zum ersten Mal angetroffen wird
  2. Die Schleife wird fortgesetzt, solange die Bedingung (i <= 5) erfüllt ist
  3. Jedes Mal, wenn die Schleife umrundet wird, wird die Variable inkrementiert (i ++).

Das Iterieren zwischen zwei Werten ist häufig genug, um eine kürzere, etwas weniger verwirrende Alternative zu finden:

für i in {1..5}
machen
echo $ i
getan

Die Klammererweiterung, die stattfindet, übersetzt die obige for-Schleife effektiv in:

für i in 1 2 3 4

Feinere Schleifensteuerung mit Pause und Weiter

Komplexere Schleifen erfordern häufig eine Möglichkeit, die Hauptschleife vorzeitig zu beenden oder sofort mit dem nächsten Wert neu zu starten. Zu diesem Zweck leiht bash die Anweisungen break und continue aus, die in anderen Programmiersprachen üblich sind. Hier ist ein Beispiel, in dem beide verwendet werden, um die erste Datei mit mehr als 100 Zeichen zu finden:

#! / bin / bash
für Datei in *
machen
wenn [! -f "$ file"]
dann
echo "$ file ist keine Datei"
fortsetzen
fi
num_chars = $ (wc -c echo $ file ist "$ num_chars Zeichen lang"
if [$ num_chars -gt 100]
dann
echo "Gefundene $ Datei"
brechen
fi
getan

Die for-Schleife wirkt sich hier auf alle Dateien im aktuellen Verzeichnis aus. Wenn es sich bei der Datei nicht um eine reguläre Datei handelt (z. B. wenn es sich um ein Verzeichnis handelt), wird die continue-Anweisung verwendet, um die Schleife mit der nächsten Datei nacheinander neu zu starten. Wenn es sich um eine reguläre Datei handelt, bestimmt der zweite bedingte Block, ob er mehr als 100 Zeichen enthält. In diesem Fall wird die break-Anweisung verwendet, um die for-Schleife sofort zu verlassen (und das Ende des Skripts zu erreichen).

Fazit

Ein Bash-Skript ist eine Datei, die eine Reihe von Anweisungen enthält, die ausgeführt werden können. Mit einer for-Schleife kann ein Teil eines Skripts viele Male wiederholt werden. Mit der Verwendung von Variablen, externen Befehlen und den Anweisungen break und continue können Bash-Skripte komplexere Logik anwenden und eine Vielzahl von Aufgaben ausführen.

Email
Apples App-Datenschutzetiketten sind möglicherweise nicht ganz genau

Der Bericht weist darauf hin, dass die App-Datenschutzetiketten von Apple möglicherweise Probleme aufweisen.

Verwandte Themen
  • Programmierung
  • Linux
Über den Autor
Bobby Jack (19 Artikel veröffentlicht)

Bobby ist ein Technologie-Enthusiast, der fast zwei Jahrzehnte als Softwareentwickler gearbeitet hat. Er liebt das Spielen, arbeitet als Reviews Editor beim Switch Player Magazine und ist in alle Aspekte des Online-Publizierens und der Webentwicklung vertieft.

Mehr von Bobby Jack

Abonniere unseren Newsletter

Melden Sie sich für unseren Newsletter an, um technische Tipps, Rezensionen, kostenlose E-Books und exklusive Angebote zu erhalten!

Noch ein Schritt…!

Bitte bestätigen Sie Ihre E-Mail-Adresse in der E-Mail, die wir Ihnen gerade gesendet haben.

.