So verwenden Sie Bash -Unterschalen im Inneren, wenn Anweisungen

So verwenden Sie Bash -Unterschalen im Inneren, wenn Anweisungen

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
So verwenden Sie Bash -Unterschalen im Inneren, wenn Anweisungen

Softwareanforderungen und Konventionen verwendet

Softwareanforderungen und Linux -Befehlszeilenkonventionen
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