So verwenden Sie Bash -Unterschalen im Inneren, wenn Anweisungen
- 2791
- 284
- Matteo Möllinger
Wenn Sie jemals Bash -Unterschalen verwendet haben ($ (…)
) Sie wissen, wie flexible Unterschalen sein können. Es braucht nur ein paar Zeichen, um eine Unterschale zu starten, um alles zu verarbeiten, was erforderlich ist, und in einer anderen Anweisung inline. Die Anzahl möglicher Anwendungsfälle ist praktisch unbegrenzt.
Wir können auch Bash -Unterschalen im Inneren verwenden Wenn
Aussagen, inline mit der Erklärung. Dies gibt dem Benutzer und dem Entwickler viel zusätzliche Flexibilität, wenn es um das Schreiben von Bash geht Wenn
Aussagen.
Wenn Sie noch nicht vertraut sind (oder mehr darüber erfahren möchten), ob Anweisungen, sehen Sie sich unsere Bash an, wenn Aussagen: Wenn elif sonst noch fi -Artikel.
In diesem Tutorial lernen Sie:
- Wie man Bash -Unterschalen innen einbindet
Wenn
Aussagen - Fortgeschrittene Methoden zur Einbeziehung von Bash -Unterschalen inline mit anderen Befehlen
- Beispiele, die die Verwendung von Bash -Subschalen in zeigen
Wenn
Aussagen
Softwareanforderungen und Konventionen verwendet
Kategorie | Anforderungen, Konventionen oder Softwareversion verwendet |
---|---|
System | Linux-Verteilungsunabhängige |
Software | BASH -Befehlszeile, Linux -basiertes System |
Andere | Jedes Dienstprogramm, das standardmäßig nicht in der Bash -Shell enthalten ist sudo apt-Get Installieren Sie den Dienstprogramm (oder yum install Für Redhat -basierte Systeme) |
Konventionen | # - Erfordert, dass Linux -Commands mit Root -Berechtigungen entweder direkt als Stammbenutzer oder mithilfe von verwendet werden sudo Befehl$-erfordert, dass Linux-Commands als regulärer nicht privilegierter Benutzer ausgeführt werden |
Beispiel 1: Einfach beginnen
Schauen wir uns ein einfaches Beispiel an, um zu beginnen. Beachten Sie, dass diese Aussagen, die hier in der Befehlszeile ausgeführt werden, auch in ein Bash -Shell -Skript integriert werden können (eine einfache Textdatei, vorzugsweise mit einem .Sch
Erweiterung und markiert als ausführbar mit der Verwendung der chmod +x myscript.Sch
Befehl - wo MyScript.Sch
ist ein Beispiel Dateiname). Wir stellen auch einen Fehler ein, um die Dinge interessanter zu machen.
$ if ["test" == "$ (echo 'test')"]; dann spiegele Matches an!'; sonst passt Echo nicht überein!'; FI -Übereinstimmungen! $ if ["test" == "$ (echo 'falsch')"]; dann spiegele Matches an!'; sonst passt nicht überein!'; FI stimmt nicht überein!: Befehl nicht gefunden $ gefunden
Im ersten Befehl verwenden wir einen einfachen Test (if ["selty_text" == "SONDER_OTHER_TEXT"]; Dann…
) Gleichheit zwischen zwei Saiten zu überprüfen. Für die zweite Saite haben wir eine Bash -Unterschale gestartet ($ (…)
) um das Wort auszugeben prüfen. Das Ergebnis ist das prüfen Streichhölzer prüfen und so die Befehle nach dem Dann
Die Klausel wird in diesem Fall ausgeführt Echo 'Matches!''
wird ausgeführt und Streichhölzer!
Drucke.
Im zweiten Befehl ändern wir den Echo -Befehl in einen falschen Text überein, indem wir die Unterschalen -Echo/Ausgabe zulassen falsch ($ (echo 'in Falsch')
). Wir bekommen einen seltsam aussehenden Fehler zurück. Schauen Sie genau hin, können Sie den Fehler erkennen? Vergleichen Sie auch den zweiten Befehl mit dem ersten.
Das Problem ist, dass in unserem zweiten Befehl die anders
Klausel (die ausgeführt wird, wenn das Gleichstellungsübereinstab fehlschlägt, ich.e. 'Was anders zu tun, wenn die IF -Aussage nicht wahr war) vermisst eine Echo
Befehl. Während es fließend lesen kann (falls… dann echo… sonst…), ist der Befehl falsch, da er ein zusätzliches Echo erfordert. Das Ergebnis ist, dass die Bash -Shell versucht, auszuführen Stimmt nicht überein!
Als wörtlicher Befehl.
Lassen Sie uns dies beheben!
$ if ["test" == "$ (echo 'falsch')"]; dann spiegele Matches an!'; sonst passt Echo nicht überein!'; FI stimmt nicht überein!
Viel besser. Und wir können unsere Unterschale sehen, es ist Echo
, und das volle Wenn
Anweisung richtig ausführen. Großartig, lasst uns ein wenig tiefer tauchen.
Beispiel 2: Ein bisschen komplexer ifbasierter Subshell-Anweisung
$ Var1 = "ABC"; if [["$ (echo" $ var1 ")" == * "B" *]]; dann spiegele Matches an!'; sonst passt Echo nicht überein!'; FI -Übereinstimmungen! $ Var1 = "adc"; if [["$ (echo" $ var1 ")" == * "B" *]]; dann spiegele Matches an!'; sonst passt Echo nicht überein!'; FI stimmt nicht überein!
Hier setzen wir eine Variable Var
entweder ABC
oder ADC
und die nächste Ausgabe dieser Variablen, erneut mit einer Unterschale, gegen das Vorhandensein von B
in der Zeichenfolge. Beachten Sie, dass das ursprüngliche Sternchen (*
) Präfix an die "B"
Vergleiche Klausel zeigt an Alles vor dieser Zeichenfolge und das Suffix Sternchen (*
) Ähnlich Mittelwerte Alles nach dieser Zeichenfolge. Wir können sehen, wie B
wurde im ersten gefunden ABC
String, aber nicht im zweiten Befehl/in der Zeichenfolge wo ADC
wurde als Vergleichszeichenfolge verwendet.
Beachten Sie auch, wie wir verwendet haben [[…]]
Klammern für die Wenn
Aussage diesmal. Dies hängt nicht mit der Verwendung von Unterschalen zusammen und ist einfach ein neuerer Schreibstandard Wenn
Aussagen, die für zusätzliche oder andere Anwendungsfälle als die traditionellen verwendet werden können […]
Syntax. Wir benötigen es hier, um das Special zu machen B
Übereinstimmend wir versuchen das Sternchen mit dem Sternchen (*
) Präfix und Suffix an der "B"
Vergleiche Klausel.
In einem Wenn
Aussage mit Single […]
Klammern dies würde scheitern:
$ if ["abc" == * "B" *]; dann spiegele Matches an!'; sonst passt Echo nicht überein!'; FI stimmt nicht überein! $ if [["abc" == * "b" *]]; dann spiegele Matches an!'; sonst passt Echo nicht überein!'; FI -Übereinstimmungen!
Als die Wenn [… ]
Syntax erkennt den Sternchen nicht (*
) Präfix und Suffix an der "B"
Vergleichen Sie Klausel und man muss verwenden [[…]]
Brackets stattdessen.
Eine andere Sache zu beachten ist, dass wir diesmal doppelte Zitate verwendet haben ("
) In der Unterschale (anstelle der einzelnen Zitate wie im ersten Beispiel): Wenn man eine Unterschale startet. In einigen Situationen ist es praktisch. Die Doppelzitate beenden die angefänglichen Zitate nicht vor und außerhalb der Unterschale.
Bitte beachten Sie, dass bei den meisten vorherigen Beispielen einfach der Unterschalen von der Unterschale ausgelassen und direkt mit der Variablen vergleichbar sein könnte, i.e.:
$ Var1 = "ABC"; if [["$ var1" == * "b" *]]; dann spiegele Matches an!'; sonst passt Echo nicht überein!'; FI -Übereinstimmungen!
Wir haben uns jedoch dafür entschieden, Unterschalen mit vorzustellen Echo
(effektiv eine Nulloperation, ich.e. effektiv die gleiche wie nur die Variable oder den betreffenden Text), wie es hervorheben würde, dass 1) Unterschalen effektiv funktionieren und 2) von innen verwendet werden können Wenn
Aussagen.
Beispiel 3: Fortgeschrittene ifbasierte Subshell-Anweisungen
Wir müssen unsere Subschalenverwendung im Inneren nicht einschränken Wenn
Aussagen zu einem einzigen Befehl oder zur Verwendung von Echo
allein. Lassen Sie uns ein kleines Setup machen:
$ touch a $ ls - -color = nie ./a | WC -l 1
Wir haben eine Datei namens erstellt A
, und zählte die Anzahl der Zeilen (mit Verwendung WC -l
, ein Zählwerkzeug, das die Anzahl der Zeilen mit der Verwendung der Zeilen zählen kann -l
Möglichkeit). Wir haben auch sichergestellt, dass wir die vorstellen --Farbe = nie
Option zu ls
Um das Analyse von Problemen zu vermeiden, wenn die Farbcodierung der Klemme verwendet wird.
Lassen Sie uns als nächstes diese Aussagen direkt in die Arbeit arbeiten Wenn
Aussagen:
$ wenn [-z "$ (ls - -color = nie ./a | wc -l) "]; dann echo" leere Verzeichnisausgabe!"; fi $ wenn [" $ (ls - -color = nie ./a | wc -l) "-eq 1]; dann echo" genau eine Datei gefunden!"; fi genau eine Datei gefunden! $
Hier verwenden wir das gleiche ls… wc -l
Code zweimal direkt von innerhalb eines Wenn
Stellungnahme. Der erste Wenn
Anweisung, die verwendet -z
Überprüft, ob der Text zwischen den Zitaten (die erste Option zur ersten Option -z
If-Inruction) ist leer. Es ist nicht wie das ls
Der Befehl liefert in diesem Fall eine gewisse Ausgabe, da wir die Datei erstellt haben A
.
Im zweiten Befehl testen wir tatsächlich, ob die Ausgabe von unserer Ausgabe ls… wc -l
Der Befehl entspricht 1 durch die Verwendung des -Gl
Testoption in der Wenn
Stellungnahme. Gl
steht für gleich. Beachten Sie, dass -Gl
(Und es ist umgekehrt -ne
Sein Nicht gleichzusetzen mit) kann nur für Zahlen verwendet werden. Verwenden Sie für textbasierte Zeichenfolgen ==
(gleich) und !=
(nicht gleich) stattdessen.
Die Ausgabe des Befehls (Genau eine Datei gefunden!
) ist richtig und unsere Wenn
Aussage mit integriertem Multi-Command-Subshell funktioniert einwandfrei!
Es ist auch von Interesse zu beachten, dass der erste Wert des zweiten Werts des ersten Werts ist Wenn
Aussage (i.e. $ (ls - -color = nie ./a | wc -l)
mit Ausgang 1
) ist numerisch. Also, warum haben wir zwei doppelte Zitate verwendet ("..."
) um die Subshell -Erklärung? Dies hat nichts mit Unterschalen zu tun und alles mit der Art und Weise, wie Wenn
Arbeitet in Bash, und man kann diesen Trick oder diese Kurzschrift möglicherweise noch nicht kennen; Bitte bedenken Sie Folgendes:
$ V = "1 1" $ if [$ v -eq 0]; dann echo '0'; fi bash: [: zu viele Argumente $ if ["$ v" -Eq 0]; dann echo '0'; fi bash: [: 1 1: ganzzahliger Ausdruck erwartet $ v = 0 $ if ["$ v" -Eq 0]; dann echo '0'; fi 0
Mit anderen Worten, die Verwendung von Doppelzitaten ist eine etwas sicherere Art der Programmierfash Wenn
Aussagen, auch wenn die Bedingung eine numerisch -basierte Bedingung ist. Es schützt vor komplexeren Saiten, die als einzelne Elemente interpretiert werden, anschließend als einzelner Wert und gibt eine korrekte Fehlermeldung zurück (ganzzahliger Ausdruck erwartet
) anstelle der mehrdeutigeren Bash: [: Zu viele Argumente
Fehler.
Es spielt auch keine Rolle, dass Sie vergleichen, was eine Textzeichenfolge zu sein scheint (wie angegeben von "..."
) mit einem numerischen Wert; Es funktioniert, vorausgesetzt, die Nummer ist numerisch. Und wenn dies nicht der Fall ist, bietet es immer noch eine bessere Fehlermeldung, die darauf hinweist, dass die Zeichenfolge nicht numerisch ist, wie gesehen ist. Zusammenfassend lässt sich sagen. Um dies gut zu beweisen, überlegen Sie:
$ wenn ["1" -Eq "1"]; dann echo 'y'; fi y $ wenn ["1" -Eq "0"]; dann echo 'y'; fi $
Abschluss
In diesem Artikel haben wir uns mit der Einbeziehung von Bash -Subschalen in die Innenseite befasst Wenn
Aussagen. Wir haben mehrere Beispiele von Easy bis Advanced untersucht, wie wir Bash -Unterschalen im Inneren verwenden können Wenn
Aussagen. Wir haben uns beim Vergleich auch beim Vergleich numerischer Felder auch ein wenig in die Verwendung von Doppelzitaten eingetaucht. Verwenden von Unterschalen in anderen Befehlen und in diesem Fall Wenn
Aussagen sind eine leistungsstarke Möglichkeit, Ihre Bash -Scripting -Fähigkeiten zu erweitern. Genießen!
Verwandte Linux -Tutorials:
- Erweiterte Linux -Unterschalen mit Beispielen
- Linux -Unterschalen für Anfänger mit Beispielen
- Bash if Aussagen: if, elif, sonst, dann, fi
- Mastering -Bash -Skriptschleifen beherrschen
- GDB -Debugging -Tutorial für Anfänger
- Multi-Thread-Bash-Skript- und Prozessmanagement bei der…
- Schleifen mit Beispielen verprügeln
- Dinge zu tun nach der Installation Ubuntu 20.04 fokale Fossa Linux
- Eine Einführung in Linux -Automatisierung, Tools und Techniken
- Spezielle Bash -Variablen mit Beispielen
- « Prozesslistenverwaltung und automatische Prozessabschluss
- Beste Linux -Distribution für Entwickler »