Im ersten Teil dieses Bash-Skripting-Tutorials haben wir besprochen, wie man ein Bash-Skript schreibt. Wir haben die verschiedenen Verwendungen und einzigartigen Szenarien untersucht, in denen Bash-Skripte nützlich sein können, und ein großartiges Beispiel dafür gegeben, wie unglaublich sie sein können.
In diesem Teil des Tutorials werfen wir einen Blick auf for
Befehl und das while
Befehl. Wir zeigen, wie wir diese Befehle verwenden können, um Schleifen zu erstellen, um eine Reihe von Werten zu durchlaufen.
Die For-Schleife
In Linux verwenden wir eine Schleife, um Befehle in einem bestimmten Intervall wiederholt auszuführen. Schleifen werden in einer Vielzahl von Programmiersprachen für denselben Zweck verwendet.
Es gibt mehrere verschiedene Arten von Schleifen in Linux, aber in diesem Abschnitt des Artikels konzentrieren wir uns auf for
Schleife.
#!/bin/bash for y in a b c d w x y z > do > echo $y done
Wie Sie im obigen Screenshot sehen können, haben wir die „y“-Variable – die nur ein bedeutungsloser Platzhalter ist, der für den Befehl verwendet wird – einigen Buchstaben des Alphabets zugeordnet.
Wir haben diese Variable dann an echo
übergeben Befehl, und es war in der Lage, unsere Buchstaben unten auszugeben.
Iteration über einfache Werte
Wir können den for
verwenden Befehl in einem Bash-Skript. Dazu müssen wir zunächst eine Textdatei in unserem Linux-Terminal erstellen. Sie können den touch
verwenden Befehl zum einfachen Erstellen von Textdateien.
$ touch script
Die obige Syntax erstellt eine Textdatei, die wir „Skript“ nennen. Bitte stellen Sie sicher, dass Sie Ihre Textdatei mit dem .sh
erstellen Dateierweiterung. Beim Erstellen von script
, möchten wir in unserem eigentlichen Skript bearbeiten, das den for
enthält Befehl.
Wir können dies erreichen, indem wir ein paar verschiedene Befehle zum Bearbeiten von Textdateien ausführen, wie z. B. nano
Befehl und das vi
Befehl usw.
Wir empfehlen jedoch, einfach nano
zu verwenden , da es einer der einfachsten und benutzerfreundlichsten Befehlstexteditoren in Linux ist.
$ nano script
Die obige Syntax öffnet unser script
im Nano-Texteditor. Hier möchten wir unser Skript eingeben.
Beachten Sie, dass diese Textdatei #!/bin/bash
enthalten muss , das das Bash-Skript darüber informiert, welche Shell verwendet werden soll, und somit eine zentrale Komponente für die erfolgreiche Erstellung eines Bash-Skripts ist.
#!/bin/bash for var in first second third fourth fifth; do echo The $var item done
Iteration über komplexe Werte
Im vorherigen Beispiel haben wir gezeigt, wie man for
verwendet Befehl zum Durchlaufen einfacher Werte in einem benutzerdefinierten Bash-Skript. Das Wort einfach bezieht sich hier auf Werte, die nur ein einziges Wort enthalten.
Aber manchmal haben Sie eine Liste, die – anstelle von dem, was wir im vorherigen Beispiel mit „first“ gesehen haben – etwas in der Art von „the first“ enthält, das zufällig mehr als ein Wort für einen einzelnen Wert enthält. Diese Werte nennen wir „komplexe“ Werte.
Wenn Ihre Liste diese komplexen Werte enthält, müssen Sie darauf verweisen, indem Sie sie in Anführungszeichen setzen, damit das Skript versteht, dass es sich nur um einen Wert handelt.
#!/bin/bash for var in first "the second" "the third" "I’ll do it"; do echo "This is: $var" done
Befehlsersetzung
Wir können auch die Befehlsersetzung in unserem for
verwenden Befehl in unserem Bash-Skript.
#!/bin/bash my_file="file01" for var in $(cat $my_file); do echo " $var" done
Hier haben wir die Befehlssubstitution mit einer Bash-Subshell verwendet, wie die Verwendung des cat-Befehls innerhalb von $( )
zeigt; Dadurch können wir die Ausgabe von cat
verwenden Befehl und erhalte den Inhalt der Datei unter der Annahme, dass jede Zeile ein Wort enthält.
Wenn jedoch in einer dieser Zeilen Leerzeichen vorhanden sind, wird jedes Wort als Feld betrachtet. In diesem Fall müssen Sie die Shell anweisen, neue Zeilen als Trennzeichen statt Leerzeichen zu behandeln.
Der Feldtrenner
Standardmäßig werden die folgenden Zeichen von der Bash-Shell als Felder betrachtet.
- Leerzeichen
- Tab
- neue Zeile
Wenn Ihr Text eines dieser Zeichen enthält, geht die Shell davon aus, dass es sich um ein neues Feld handelt, und Sie müssen das interne Feldtrennzeichen oder die IFS-Umgebungsvariable ändern, wenn Sie diese Zeichen verwenden müssen.
$ IFS=$’n’
Die obige Syntax bewirkt, dass die Bash-Shell neue Zeilen als Trennzeichen statt als Leerzeichen betrachtet.
#!/bin/bash file="/etc/passwd" IFS=$'n' for var in $(cat $file); do echo " $var" done
Sie können den Feldtrenner auch mit IFS
an Doppelpunkte zuweisen wie unten gezeigt.
$ IFS=:
Ziemlich fantastisch, oder?
Iteration über Verzeichnisdateien
Sie können auch den for
verwenden Schleife in einem Bash-Skript, um die Dateien in Ihrem Home-Verzeichnis aufzulisten.
#!/bin/bash for obj in /home/ubuntu/*; do if [ -d "$obj" ]; then echo "$obj is a folder" elif [ -f "$obj" ]; then echo "$obj is a file" fi done
Dieser Prozess erfordert, dass Sie den if
verwenden Anweisung zum Überprüfen von Dateien und Ordnern. Aber das sollte für Sie kein großes Problem darstellen, wenn Sie den vorherigen Beitrag gelesen haben. Aber wenn Sie zufällig eine Auffrischung benötigen, würde ich empfehlen, sie zu lesen.
Wir haben in unserem Bash-Skript einen Platzhalter namens Stern (*) verwendet, der einen for
enthält -Schleife, mit der wir die Dateien und Ordner in unserem Home-Verzeichnis auflisten können. Beim Bash-Scripting wird dieser Vorgang als „File Globbing“ bezeichnet .“ File Globbing bedeutet alle existierenden Dateien mit einem Namen.
Beachten Sie, dass die Variablen in unserem if
-Anweisung werden in Anführungszeichen geschrieben, da die Datei- oder Ordnernamen Leerzeichen enthalten können. Hätten wir diesen Schritt ausgelassen, hätten wir möglicherweise nicht alle Dateien und Verzeichnisse auflisten können.
Über Dateizeilen iterieren
Wir können den for
verwenden Schleife in einem Bash-Skript, um den Dateiinhalt zu durchlaufen:
#!/bin/bash IFS=$'n' for text in $(cat /etc/passwd); do echo "This line $text ++ contains" IFS=: for field in $text; do echo " $field" done done
Hier haben wir zwei Schleifen, die erste Schleife iteriert über die Zeilen der Datei, und das Trennzeichen ist die neue Zeile, die zweite Iteration ist über die Wörter in der Zeile selbst, und das Trennzeichen ist der Doppelpunkt :
Dateidaten
Sie können diese Idee anwenden, wenn Sie eine CSV-Datei oder eine Datei mit kommagetrennten Werten haben. Die Idee ist dieselbe; Sie müssen nur das Trennzeichen an Ihre Bedürfnisse anpassen.
Für Loop C-Style
Wenn Sie mit der Sprache C vertraut sind, werden Sie vielleicht bemerken, dass etwas an for
nicht stimmt Schleifen in Linux manchmal.
Dies liegt daran, dass es zwei Möglichkeiten gibt, for
zu schreiben Schleifen; der Standard-Linux-Weg, den wir bereits am Anfang dieses Tutorials behandelt haben, und der „C-Stil“-Weg.
for (var= 0; var < 5; var++) { printf(“number is %dn”, var); }
Die obige Syntax gilt für for
Schleife in C geschrieben. Der C-Stil for
loop in Linux ist sehr ähnlich geschrieben, mit ein paar kleinen Änderungen, die unten beobachtet werden können.
for (( Variable =Start; Bedingung; Iterationsschritt))
for (( var = 1; var < 5; var++ ))
Um das Bild besser zu zeichnen, fügen wir ein Bash-Beispielskript ein, das den C-Stil for
verwendet Schleife in unserem Linux-Terminal.
#!/bin/bash for ((var = 1; var <= 10; var++)); do echo "number is $var" done
Fügen Sie dies in unsere Textdatei ein und starten Sie es.
Der Fortsetzungsbefehl
Die Bash continue
command ignoriert die Befehle innerhalb der äußeren Schleife für die aktuelle Iteration und übergibt die Kontrolle an die nächste. Sie können diesen Befehl verwenden, um die Ausführung der verbleibenden Befehle innerhalb einer Schleife zu stoppen, ohne die Schleife zu verlassen.
In den nächsten Beispielen sehen wir uns an, wie dieser Befehl in Bash-Skriptschleifen unter Linux verwendet werden kann.
Der Break-Befehl
Sie können den break-Befehl verwenden, um jede Schleife zu verlassen, wie die While- und die Until-Schleifen.
#!/bin/bash for number in 10 11 12 13 14 15; do if [ $number -eq 14 ]; then break fi echo "Number: $number" done
Die Schleife läuft, bis sie 14 erreicht, dann verlässt der Befehl die Schleife.
Wir werden etwas später auf einige weitere Beispiele für diesen Befehl eingehen.
Die While-Schleife
Die for-Schleife ist nicht die einzige Möglichkeit zum Schleifen in Bash-Skripten. Das while
loop erledigt die gleiche Aufgabe, prüft jedoch vor jeder Iteration auf eine Bedingung. Die Struktur von while
Schleife ist unten zu sehen.
while [ condition ] do commands done
Wir stellen ein Beispiel mit einem Bash-Skript bereit.
#!/bin/bash number=10 while [ $number -gt 4 ]; do echo $number number=$(($number - 1)) done
Die Funktionsweise dieses Bash-Skripts ist einfach; es beginnt mit dem while
Befehl, um zu überprüfen, ob die Zahl größer als Null ist, dann wird die Schleife ausgeführt und der Zahlenwert wird jedes Mal um 1 verringert. Bei jeder Schleifeniteration gibt das Skript den Wert der Zahl aus. Die Schleife wird ausgeführt, bis diese Zahl 0 erreicht.
Verschachtelte Schleifen
Sie können Schleifen innerhalb anderer Schleifen erstellen, wie while
Schleife zum Beispiel. Diese Schleifen innerhalb einer Schleife werden als verschachtelte Schleifen bezeichnet. Wir werden in diese eintauchen, indem wir zuerst untersuchen, wie man einen verschachtelten for
erstellt Schleife im folgenden Beispiel.
Mehrere for-Schleifen (verschachtelt for)
In den bisherigen Beispielen in diesem Tutorial haben wir gezeigt, wie man for
erstellt Schleifen in einem Bash-Skript unter Linux. Aber es gibt auch etwas, das wir verschachteltes for
nennen Schleifen. Dies sind Schleifen innerhalb anderer Schleifen oder einfach mehrere Schleifen, um es einfach auszudrücken.
Wir zeigen Ihnen ein einfaches Beispiel dafür, wie das aussieht, zusammen mit einer kurzen Untersuchung und Beschreibung weiter unten.
for y in a b c d e f do for u in a b c d e f do echo "$y$u" done done
Wie Sie im obigen Screenshot sehen können, lautet die Ausgabe, die wir beim Ausführen unseres Skripts im Linux-Befehlszeilenterminal erhalten, wie folgt:unser Beispieltext in jedem for
Schleife ist „a b c d e f“.
Unser Skript wiederholt den Text in der äußeren Schleife neben dem Text aus der inneren Schleife.
Das Skript gibt weiterhin das erste Feld (in diesem Fall Leerzeichen, wir erklären das etwas später) des Textes in der äußeren Schleife aus, bis alle in der inneren Schleife enthaltenen Felder ausgegeben wurden.
Nach Abschluss der Ausgabe der inneren Schleife beginnt unser Bash-Skript mit der Ausgabe des folgenden Textfelds in der äußeren Schleife.
Dieser gesamte Vorgang wird wiederholt, bis jedes Feld jeder Schleife vollständig in der Ausgabe in Ihrem Linux-Terminal gedruckt wurde.
Mehrere While-Schleife (verschachteltes While)
Wie das verschachtelte for
Befehlsschleifen gibt es auch verschachtelte while
Befehlsschleifen. Diese funktionieren genauso wie die verschachtelten Schleifen für for
Befehl; eine Schleife innerhalb einer anderen Schleife.
Die folgende Syntax hat eine verblüffende Ähnlichkeit mit dem regulären while
Schleife als Struktur eines verschachtelten while
Schleife ist einfach eine erweiterte Form der Basis while
Schleife, die in der folgenden Syntax beobachtet werden kann.
while [condition] do statements1 statements2 while [condition] do continue done statements3 done
Die obige Syntax führt bestimmte Aufgaben aus, bis die von Ihnen ausgewählten Bedingungen erfüllt sind. Das nennt man Schleife. Da die Schleife im obigen Beispiel jedoch verschachtelt ist, bedeutet dies, dass eine der oben erwähnten Aufgaben selbst eine weitere Schleife ist.
While Next
Wir haben gezeigt, wie das while
Schleife und den for
Schleife kann sehr nützlich sein, um komplexe Prozesse mit Bash-Skripten unter Linux auszuführen.
Aber manchmal müssen Sie aus verschiedenen Gründen eine der Schleifen in Ihrem Bash-Skript beenden. Dieses Szenario, so brutal es auch klingen mag, tritt häufig bei der Arbeit der Systemadministration auf. Vielleicht möchten Sie sich also mit diesem Konzept vertraut machen.
In der Bash-Shell der break
Befehl und den continue
Der Befehl kann die notwendigen Tools zum Steuern des Flusses Ihrer Bash-Skriptschleifen bereitstellen.
Wir zeigen, wie diese Befehle einzeln mit ein paar Beispielen unten funktionieren.
Die Syntax für die Verwendung des brea
Befehl zum Beenden eines while
Schleife ist wie folgt:
$ while [ condition ] do commands continue done
Der continue
Befehl break
Befehle arbeiten sehr ähnlich und können als Gegensätze betrachtet werden; continue
Der Befehl funktioniert genauso wie der break
Befehl, nur setzt es die Schleife fort, anstatt sie zu beenden.
While-Schleife verlassen
Die break
beendet die aktuelle Schleife und übergibt die Kontrolle an den nächsten Befehl, der dieser Schleife folgt. Sie können diesen Prozess verwenden, um Schleifen wie for
zu verlassen ,while
usw. Die Syntax des break
Befehl lautet wie folgt:
$ while [ condition ] do commands break done
Aber wie oben erwähnt, beide continue
Befehl und den break
Der Befehl kann neben while
auch für andere Bash-Skriptschleifen verwendet werden Schleife. Wir zeigen, wie man sie im for
verwendet Schleife.
For-Schleife verlassen
Sie können diese Schleifensteuerungsbefehle in einem for
verwenden Schleife. Wir verwenden den break
Befehl zum Verlassen des for
Schleife in unserem Bash-Skript.
#!/bin/bash for number in 10 11 12 13 14 15; do if [ $number -eq 14 ]; then break fi echo "Number: $number" done
Der for
Schleife läuft, bis sie die Zahl erreicht, die wir im Bash-Skript angegeben haben, nämlich 14. Beim Erreichen unserer angegebenen Zahl wird der break
Der Befehl beendet den for
Schleife.
Break If-Anweisung
Wir haben gerade gezeigt, wie wir break
verwenden können Befehl zum Beenden von for
Schleifen, aber wir können diesen Befehl auch verwenden, um if
zu verlassen -Anweisung innerhalb dieser Bash-Skriptschleifen.
i=0 while [[ $i -lt 10 ]] do echo "Number: $i" ((i++)) if [[ $i -eq 5 ]]; then break fi done
Anweisung fortsetzen
Wir machen dasselbe wie im vorherigen Beispiel mit dem continue
Befehl, wie wir es mit dem break
getan haben Befehl in einem while
Schleife in einem Bash-Skript.
i=0 while [[ $i -lt 10 ]]; do ((i++)) if [[ "$i" == '5' ]]; then continue fi echo "Number: $i" done
Abschlussgedanken
Ich hoffe, Sie haben ein oder zwei neue Dinge gelernt. Oder zumindest hoffe ich, dass Sie überprüfen konnten, was Sie bereits wissen. Meine letzten Worte heute für Sie wären, weiter zu lesen und zu üben.
Danke.