If Anweisungen!
, Entscheidungen, Entscheidungen.
Einführung
Bash if Anweisungen sind sehr nützlich. In diesem Abschnitt unseres Bash-Scripting-Tutorials erfahren Sie, wie Sie if-Anweisungen in Ihren Bash-Skripten verwenden können, um Aufgaben zu automatisieren.
If-Anweisungen (und eng verwandte Case-Anweisungen) ermöglichen es uns, Entscheidungen in unseren Bash-Skripten zu treffen. Sie erlauben uns zu entscheiden, ob wir einen Code basierend auf Bedingungen ausführen oder nicht, die wir festlegen können., If-Anweisungen in Kombination mit Schleifen (die wir im nächsten Abschnitt betrachten werden) ermöglichen es uns, viel komplexere Skripte zu erstellen, die größere Aufgaben lösen können.
Wie wir in den vorherigen Abschnitten gesehen haben, ist ihre Syntax sehr spezifisch, also bleiben Sie auf all den kleinen Details.
Basic If-Anweisungen
Eine basic if-Anweisung sagt effektiv, wenn ein bestimmter Test wahr ist, führen Sie einen bestimmten Satz von Aktionen aus. Wenn es nicht wahr ist, führen Sie diese Aktionen nicht aus., Wenn folgt dem folgenden format:
wenn
dann
<Befehle>
fi
Alles, was zwischen then und fi (wenn rückwärts), wird nur ausgeführt, wenn test (zwischen eckigen Klammern) wahr ist.
schauen wir uns ein einfaches Beispiel an:
if_example.sh
- #!/bin/bash
- # Grundlegende if-Anweisung
- wenn
- dann
- echo Hey, das\’s eine große Anzahl.,
- pwd
- fi
- date
Lassen Sie es uns aufschlüsseln:
- Zeile 4 – Mal sehen, ob das erste Befehlszeilenargument größer als 100
- Zeile 6 und 7 ist – Wird nur ausgeführt, wenn der Test in Zeile 4 true zurückgibt. Sie können hier so viele Befehle haben, wie Sie möchten.
- Zeile 6-Der umgekehrte Schrägstrich ( \ ) vor dem einfachen Anführungszeichen ( ‚ ) wird benötigt, da das einfache Anführungszeichen eine besondere Bedeutung für bash hat und wir diese besondere Bedeutung nicht wollen. Der Backslash entgeht der besonderen Bedeutung, um es wieder zu einem normalen einfachen einfachen Zitat zu machen.,
- Zeile 8-fi signalisiert das Ende der if-Anweisung. Alle Befehle danach werden wie gewohnt ausgeführt.
- Zeile 10-Da sich dieser Befehl außerhalb der if-Anweisung befindet, wird er unabhängig vom Ergebnis der if-Anweisung ausgeführt.
- ./if_example.sh 15
- Fri 5 Feb 9:06:30 bis Januar 2021
- ./if_example.sh 150
- Hey, das ist eine große Zahl.
- / home/ryan/bin
- Fri 5 Feb 9:06:30 2021
Es ist immer eine gute Praxis, Ihre Skripte mit Eingaben zu testen, die die verschiedenen Szenarien abdecken, die möglich sind.,
Test
Die eckigen Klammern () in der obigen if-Anweisung sind tatsächlich ein Verweis auf den Befehlstest. Dies bedeutet, dass alle Operatoren, die Test erlaubt, auch hier verwendet werden können. Schauen Sie sich die Manpage für Test an, um alle möglichen Operatoren zu sehen (es gibt einige), aber einige der häufigsten sind unten aufgeführt.
Operator | Beschreibung |
---|---|
! AUSDRUCK | Der AUSDRUCK ist falsch. |
-n STRING | Die Länge der ZEICHENFOLGE ist größer als null., |
– z STRING | Die Länge der ZEICHENFOLGE ist Null (dh sie ist leer). |
STRING1 = STRING2 | STRING1 ist gleich STRING2 |
STRING1 != STRING2 | STRING1 ist nicht gleich STRING2 |
INTEGER1-eq INTEGER2 | INTEGER1 ist numerisch gleich INTEGER2 |
INTEGER1-gt INTEGER2 | INTEGER1 ist numerisch größer als INTEGER2 |
INTEGER1-lt INTEGER2 | INTEGER1 ist numerisch kleiner als INTEGER2 |
-d FILE | FILE exists and is a directory., |
– e DATEI | DATEI existiert. |
-r FILE | DATEI vorhanden ist und die lese-Berechtigung erteilt. |
– s DATEI | DATEI existiert und es ist Größe größer als Null (dh. es ist nicht leer). |
-w-DATEI | DATEI vorhanden ist und Schreibberechtigungen gewährt wird. |
-x – | DATEI vorhanden ist, und die execute-Berechtigung gewährt wird. |
Einige Punkte zu beachten:
- = unterscheidet sich geringfügig von-eq. gibt false zurück, wenn = einen Zeichenfolgenvergleich durchführt (dh., zeichen für Zeichen gleich) während -eq einen numerischen Vergleich durchführt, wird die Bedeutung true zurückgegeben.
- Wenn wir auf die obige DATEI verweisen, meinen wir tatsächlich einen Pfad. Denken Sie daran, dass ein Pfad absolut oder relativ sein kann und sich auf eine Datei oder ein Verzeichnis beziehen kann.
- Da es sich nur um einen Verweis auf den Befehlstest handelt, können wir experimentieren und Probleme mit dem Test in der Befehlszeile lösen, um sicherzustellen, dass unser Verständnis des Verhaltens korrekt ist.
- test 001 = 1
- echo $?
- 1
- test 001 -eq-1
- echo $?,
- 0
- touch myfile
- test -s myfile
- echo $?
- 1
- ls /etc > myfile
- test -s myfile
- echo $?
- 0
Lassen Sie es uns aufschlüsseln:
- Zeile 1 – Führen Sie einen String-basierten Vergleich durch. Test druckt das Ergebnis nicht, also überprüfen wir stattdessen den Exit-Status, was wir in der nächsten Zeile tun werden.
- Zeile 2 Die variable $? hält den Exit-Status des zuvor ausgeführten Befehls (in diesem Fall test). 0 bedeutet WAHR (oder Erfolg). 1 = FALSCH (oder Fehler).,
- Zeile 4-Dieses Mal führen wir einen numerischen Vergleich durch.
- Zeile 7-Erstellen Sie eine neue leere Datei myfile (vorausgesetzt, myfile ist noch nicht vorhanden).
- Zeile 8-Ist die Größe meiner Datei größer als Null?
- Zeile 11-Leiten Sie einige Inhalte in myfile um, damit ihre Größe größer als Null ist.
- Zeile 12-Testen Sie die Größe meiner Datei erneut. Diesmal ist es WAHR.
Einrücken
Sie werden feststellen, dass wir in der obigen if-Anweisung die Befehle eingerückt haben, die ausgeführt wurden, wenn die Anweisung wahr war., Dies wird als Einrücken bezeichnet und ist ein wichtiger Teil des Schreibens von gutem, sauberem Code (in jeder Sprache, nicht nur Bash-Skripten). Ziel ist es, die Lesbarkeit zu verbessern und es uns schwerer zu machen, einfache, dumme Fehler zu machen. Es gibt keine Regeln zum Einrücken in Bash, daher können Sie einrücken oder nicht einrücken, wie Sie möchten, und Ihre Skripte werden immer noch genau gleich ausgeführt. Ich würde Ihnen jedoch dringend empfehlen, Ihren Code einzurücken (insbesondere wenn Ihre Skripte größer werden), da es sonst immer schwieriger wird, die Struktur in Ihren Skripten zu sehen.,
Verschachtelte If-Anweisungen
Apropos Einrücken. Hier ist ein perfektes Beispiel dafür, wann es Ihnen das Leben erleichtert. Möglicherweise befinden sich in Ihrem Skript so viele if-Anweisungen wie erforderlich. Es ist auch möglich, eine if-Anweisung in einer anderen if-Anweisung zu haben. Beispielsweise möchten wir möglicherweise eine in der Befehlszeile angegebene Zahl wie folgt analysieren:
Brechen wir sie auf:
- Zeile 4 – Führen Sie Folgendes aus, nur wenn das erste Befehlszeilenargument größer als 100 ist.
- Zeile 8-Dies ist eine leichte Variation der if-Anweisung., Wenn wir einen Ausdruck überprüfen möchten, können wir die doppelten Klammern genau wie für Variablen verwenden.
- Zeile 10-Wird nur ausgeführt, wenn beide if-Anweisungen wahr sind.
Yo dawg, I-Herde, die Sie wie if-Anweisungen, also legte ich eine if-Anweisung in der if-Anweisung.
Xzibit
(Xzibit hat das eigentlich nicht gesagt, aber ich bin sicher, er hätte es getan, wenn er Pimp Mein Bash-Skript gehostet hätte.,)
Sie können so viele if-Anweisungen verschachteln, wie Sie möchten, aber als allgemeine Faustregel, wenn Sie mehr als 3 Ebenen verschachteln müssen, sollten Sie wahrscheinlich darüber nachdenken, Ihre Logik neu zu organisieren.
Wenn sonst
Manchmal möchten wir einen bestimmten Satz von Aktionen ausführen, wenn eine Anweisung wahr ist, und einen anderen Satz von Aktionen, wenn sie falsch ist. Wir können dies mit dem else-Mechanismus aufnehmen.,
wenn
dann
<Befehle>
else
<anderen Befehle>
fi
Jetzt könnten wir leicht Lesen aus einer Datei, wenn es ist geliefert als ein command line argument else von STDIN Lesen.
else.sh
- #!/bin/bash
- # anderes Beispiel
- wenn
- dann
- nl $1
- else
- nl /dev/stdin
- fi
If Elif Else
Manchmal können wir haben eine Reihe von Bedingungen, die führen können, um unterschiedliche Wege.,
wenn
dann
<Befehle>
elif
dann
<verschiedene Befehle>
else
<anderen Befehlen>
fi
Zum Beispiel kann es der Fall sein, wenn Sie mindestens 18 Jahre alt sind können Sie auf die party gehen. Wenn Sie nicht sind, aber Sie haben einen Brief von Ihren Eltern können Sie gehen, müssen aber vor Mitternacht zurück sein. Sonst kannst du nicht gehen.
Sie können so viele Elif-Zweige haben, wie Sie möchten. Die letzte Option ist ebenfalls optional.,
Boolesche Operationen
Manchmal möchten wir nur etwas tun, wenn mehrere Bedingungen erfüllt sind. Andere Male möchten wir die Aktion ausführen, wenn eine von mehreren Bedingungen erfüllt ist. Wir können diese mit booleschen Operatoren aufnehmen.
- und – &&
- oder – ||
Möglicherweise möchten wir eine Operation nur ausführen, wenn die Datei lesbar ist und eine Größe größer als Null hat.
and.sh
- #!,/bin/bash
- # und Beispiel
- wenn &&
- dann
- echo Diese Datei ist nützlich.
- fi
Vielleicht möchten wir etwas anderes ausführen, wenn der Benutzer entweder bob oder andy ist.
or.sh
- #!/bin/bash
- # oder Beispiel
- if ||
- dann
- ls -alh
- else
- ls
- fi
Case-Anweisungen
Manchmal möchten wir vielleicht verschiedene Pfade basierend auf einer Variablen Anpassung einer Reihe von mustern., Wir könnten eine Reihe von if-und elif-Anweisungen verwenden, aber das würde bald unweigerlich werden. Glücklicherweise gibt es eine Case-Anweisung, die die Dinge sauberer machen kann., It’s a little hard to explain so here are some examples to illustrate:
case <variable> in
<pattern 1>)
<commands>
;;
<pattern 2>)
<other commands>
;;
esac
Here is a basic example:
case.sh
- #!,/bin/bash
- # case example
- case $1 in
- start)
- echo starting
- ;;
- stop)
- echo stoping
- ;;
- restart)
- echo restart
- ;;
- *)
- echo nicht wissen
- ;;
- esac
Lassen sie uns brechen es unten:
- Linie 4 – Diese linie beginnt die casemechanism.
- Zeile 5-Wenn $1 gleich ’start‘ ist, führen Sie die nachfolgenden Aktionen aus. das Zeichen bedeutet das Ende des Musters.,
- Zeile 7-Wir identifizieren das Ende dieses Satzes von Anweisungen mit einem doppelten Semikolon ( ;; ). Im Anschluss daran ist der nächste zu berücksichtigende Fall.
- Zeile 14-Denken Sie daran, dass der Test für jeden Fall ein Muster ist. Das * repräsentiert eine beliebige Anzahl beliebiger Zeichen. Es ist essentialy ein Fang alle, wenn für, wenn keiner der anderen Fälle übereinstimmen. Es ist nicht notwendig, wird aber oft verwendet.
- Zeile 17-esac ist Fall rückwärts und zeigt an, dass wir uns am Ende der case-Anweisung befinden. Alle anderen Anweisungen danach werden normal ausgeführt.
- ./case.sh start
- Start
- .,/case.sh neustart
- Neustart
- ./case.sh blah
- weiß nicht
Schauen wir uns nun ein etwas komplexeres Beispiel an, in dem Muster etwas mehr verwendet werden.
Zusammenfassung
Aktivitäten
Jetzt treffen wir einige Entscheidungen.
- Erstellen Sie ein Bash-Skript, das 2 Zahlen als Befehlszeilenargumente verwendet. Es wird die größere der beiden Zahlen auf dem Bildschirm gedruckt.,
- Erstellen Sie ein Bash-Skript, das eine Datei als Befehlszeilenargument akzeptiert und auf bestimmte Weise analysiert. z. sie können überprüfen, ob die Datei ausführbar oder beschreibbar ist. Sie sollten eine bestimmte Nachricht drucken, wenn true und eine andere, wenn false.
- Erstellen Sie ein Bash-Skript, das eine Nachricht basierend auf dem Wochentag ausgibt (z. „Happy Hump Day“ für Wedensday, „TGIF“ für Freitag usw.).