Alles, was Sie über Bash For Loops in Linux wissen müssen

Alles, was Sie über Bash For Loops in Linux wissen müssen

Bash-Skripte sind ein hocheffizientes Mittel zur Automatisierung von Aufgaben, insbesondere solchen, die andere vorhandene Programme nutzen. Diese Automatisierung erfordert oft die mehrfache Wiederholung eines ähnlichen Vorgangs, und genau dort ist der für Schleife kommt zur Geltung.





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





Wie Bash-Skripte funktionieren

Ein Bash-Skript ist einfach eine reine Textdatei, 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 absolut einfachsten Fall beginnen. Auf diese Weise können Sie Schlüsselkonzepte üben, einschließlich der Erstellung des Skripts und seiner Ausführung.

Erstellen Sie zunächst die folgende Datei an einem geeigneten Ort (öffnen Sie am besten ein Terminal und navigieren Sie zuerst in das gewünschte Verzeichnis):



#!/bin/bash
echo 'Hello, World'

Die erste Zeile sagt, was auch immer dieses Programm ausführt, wie es ausgeführt werden soll (d. h. mit dem Bash-Interpreter). Der zweite ist nur ein Befehl wie jeder andere, den Sie in der Befehlszeile eingeben können. Speichern Sie diese Datei unter hallo_world.sh , dann:

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

Die chmod 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 in Ihrem Terminal die Worte Hello, World auf einer Zeile erscheinen, funktioniert alles wie gewünscht.

So funktionieren For-Schleifen

In der allgemeinen Programmierung gibt es zwei Haupttypen von for-Schleifen: numerisch und für jeden . Der numerische Typ ist traditionell der gebräuchlichste, aber in der Bash-Nutzung ist es normalerweise umgekehrt.





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

for (i = 0; i <100; i++) {
/* statements to execute repeatedly */
}

Dies ist eine vertraut aussehende for-Schleife, die genau 100 Mal durchlaufen wird, 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 neigen Foreach-Schleifen dazu, mit Strukturen wie Listen oder Arrays zu arbeiten und für jedes Element innerhalb dieser Sammlung zu iterieren:

people = [ 'Peter', 'Paul', 'Mary' ]
foreach (people as person) {
if (person == 'Paul') {
...
}
}

Einige Sprachen verwenden eine etwas andere Syntax, die die Reihenfolge von Sammlung und Element vertauscht:

people = [ 'Peter', 'Paul', 'Mary' ]
for (person in people) {
if (person == 'Paul') {
...
}
}

Für in Schleifen

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

for arg in [list]
do
/* statements to execute repeatedly */
/* the value of arg can be obtained using $arg */
done

Um beispielsweise drei explizit benannte Dateien zu durchlaufen:

So ändern Sie die Festplatte von einem schreibgeschützten Mac
for file in one.c two.c three.c
do
ls '$file'
done

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

one.c
two.c
three.c

Anstelle eines festen Satzes von Dateien kann die Liste über ein Glob-Muster (eines mit Wildcards – Sonderzeichen, die andere Zeichen repräsentieren) erhalten werden. Im folgenden Beispiel durchläuft die for-Schleife alle Dateien (im aktuellen Verzeichnis), deren Namen auf '.xml' enden:

for file in *.xml
do
ls -l '$file'
done

Hier ist eine Beispielausgabe:

$ -rw-r--r-- 1 bobby staff 2436 3 Nov 2019 feed.xml
$ -rw-r--r-- 1 bobby staff 6447 27 Oct 16:24 sitemap.xml

Dies kann sehr nach einer langwierigen Vorgehensweise aussehen:

$ ls -l *.xml

Aber es gibt einen wesentlichen Unterschied: Die for-Schleife führt die ls Programm zweimal getrennt, wobei jedes Mal ein einzelner Dateiname übergeben wird. Im separaten ls-Beispiel vergleicht das Glob-Muster (*.xml) zuerst die Dateinamen und sendet sie dann alle als einzelne Befehlszeilenparameter an eine Instanz von ls .

Hier ist ein Beispiel, das die verwendet Toilette (Wortzählung) Programm, um den Unterschied deutlicher zu machen:

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

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

for file in *.xml
do
wc -l $file
done

Sie sehen weiterhin die Anzahl für jede Datei:

44 feed.xml
231 sitemap.xml

Aber es gibt keine Gesamtsumme, weil Toilette wird bei jeder Iteration der Schleife isoliert ausgeführt.

Wenn eine Liste keine Liste ist

Es gibt einen sehr einfachen und häufigen Fehler beim Umgang mit for-Schleifen, aufgrund der Art und Weise, wie die Bash Argumente/Strings in Anführungszeichen behandelt. Das Durchlaufen einer Liste von Dateien sollte wie folgt erfolgen:

for file in one.c two.c

So nicht:

for file in 'one.c two.c'

Das zweite Beispiel schließt Dateinamen in doppelte Anführungszeichen ein, was zu einer Liste mit nur einem einzigen Parameter führt; Die for-Schleife wird nur einmal ausgeführt. Dieses Problem kann in solchen Fällen durch die Verwendung einer Variablen vermieden werden:

FILES='one.c two.c'
for file in $FILES
do
...
done

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

windows 10 bleibt in reparaturschleife stecken

Für Ohne Liste

Da es nichts zu durchlaufen hat, arbeitet eine for-Schleife mit den Befehlszeilenargumenten, die dem Skript beim Aufruf zur Verfügung gestellt wurden. Wenn Sie beispielsweise ein Skript namens args.sh enthält folgendes:

#!/bin/sh
for a
do
echo $a
done

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

$ ./args.sh one two three
one
two
three

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

Emulieren einer traditionellen numerischen For-Schleife

Bash-Skripte arbeiten oft mit Listen von Dateien oder Ausgabezeilen von anderen Befehlen, daher ist der Schleifentyp for in üblich. Der traditionelle C-Style-Betrieb wird jedoch weiterhin unterstützt:

for (( i=1; i<=5; i++ ))
do
echo $i
done

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

  1. eine Variable wird initialisiert (i=1), wenn die Schleife zum ersten Mal angetroffen wird
  2. die Schleife wird solange fortgesetzt, wie die Bedingung (i<=5) is true
  3. bei jeder Schleife wird die Variable inkrementiert (i++)

Das Iterieren zwischen zwei Werten ist eine hinreichend häufige Anforderung, dass es eine kürzere, etwas weniger verwirrende Alternative gibt:

for i in {1..5}
do
echo $i
done

Die stattfindende Klammerexpansion übersetzt die obige for-Schleife effektiv in:

for i in 1 2 3 4

Feinere Schleifensteuerung mit Break und Continue

Komplexere for-Schleifen benötigen oft eine Möglichkeit, die Hauptschleife vorzeitig zu beenden oder die Hauptschleife sofort mit dem nächsten Wert wieder zu starten. Dazu übernimmt die bash die in anderen Programmiersprachen üblichen Anweisungen break und continue. Hier ist ein Beispiel, das beide verwendet, um die erste Datei zu finden, die mehr als 100 Zeichen lang ist:

#!/bin/bash
for file in *
do
if [ ! -f '$file' ]
then
echo '$file is not a file'
continue
fi
num_chars=$(wc -c <'$file')
echo $file is '$num_chars characters long'
if [ $num_chars -gt 100 ]
then
echo 'Found $file'
break
fi
done

Die for-Schleife arbeitet hier mit allen Dateien im aktuellen Verzeichnis. Handelt es sich bei der Datei nicht um eine reguläre Datei (z. B. wenn es sich um ein Verzeichnis handelt), wird mit der continue-Anweisung die Schleife der Reihe nach mit der nächsten Datei neu gestartet. Wenn es sich um eine normale Datei handelt, bestimmt der zweite Bedingungsblock, ob sie mehr als 100 Zeichen enthält. Wenn dies der Fall ist, wird die break-Anweisung verwendet, um die for-Schleife sofort zu verlassen (und das Ende des Skripts zu erreichen).

Abschluss

Ein Bash-Skript ist eine Datei, die eine Reihe von Anweisungen enthält, die ausgeführt werden können. Eine for-Schleife ermöglicht es, einen Teil eines Skripts viele Male zu wiederholen. Durch die 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.

Teilen Teilen Tweet Email Lohnt sich ein Upgrade auf Windows 11?

Windows wurde neu gestaltet. Aber reicht das aus, um Sie davon zu überzeugen, von Windows 10 auf Windows 11 umzusteigen?

Weiter lesen
Verwandte Themen
  • Programmierung
  • Linux
Über den Autor Bobby Jack(58 veröffentlichte Artikel)

Bobby ist ein Technologie-Enthusiast, der fast zwei Jahrzehnte lang als Software-Entwickler gearbeitet hat. Er hat eine Leidenschaft für Spiele, arbeitet als Rezensionsredakteur beim Switch Player Magazine und vertieft sich in alle Aspekte des Online-Publishing und der Webentwicklung.

Mehr von Bobby Jack

Abonniere unseren Newsletter

Abonnieren Sie unseren Newsletter für technische Tipps, Rezensionen, kostenlose E-Books und exklusive Angebote!

Klicken Sie hier, um zu abonnieren