GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Gekoppelte Befehle mit Steueroperatoren in Bash

Einfache zusammengesetzte Befehle – wie das Aneinanderreihen mehrerer Befehle in einer Folge auf der Befehlszeile – werden häufig verwendet. Solche Befehle werden durch Semikolons getrennt, die das Ende eines Befehls definieren. Um eine einfache Reihe von Shell-Befehlen in einer einzigen Zeile zu erstellen, trennen Sie einfach jeden Befehl mit einem Semikolon, wie hier:

command1 ; command2 ; command3 ; command4 ; 

Sie müssen kein abschließendes Semikolon hinzufügen, da das Drücken der Eingabetaste das Ende des letzten Befehls impliziert, aber es ist aus Gründen der Konsistenz in Ordnung, es hinzuzufügen.

Das Linux-Terminal

  • Die 7 besten Terminalemulatoren für Linux
  • 10 Befehlszeilentools für die Datenanalyse unter Linux
  • Jetzt herunterladen:SSH-Spickzettel
  • Spickzettel für fortgeschrittene Linux-Befehle
  • Linux-Befehlszeilen-Tutorials

Alle Befehle werden problemlos ausgeführt – solange kein Fehler auftritt. Aber was passiert, wenn ein Fehler passiert? Mit && können wir Fehler antizipieren und zulassen und || Steueroperatoren, die in Bash integriert sind. Diese beiden Steuerungsoperatoren bieten eine gewisse Flusssteuerung und ermöglichen es uns, die Codeausführungssequenz zu ändern. Das Semikolon und der Zeilenumbruch werden ebenfalls als Bash-Steuerungsoperatoren betrachtet.

Das && Operator sagt einfach "Wenn Befehl1 erfolgreich ist, dann führe Befehl2 aus." Wenn Befehl1 aus irgendeinem Grund fehlschlägt, wird Befehl2 nicht ausgeführt. Diese Syntax sieht folgendermaßen aus:

command1 && command2

Dies funktioniert, weil jeder Befehl einen Code an die Shell zurückgibt, der angibt, ob er während der Ausführung erfolgreich abgeschlossen wurde oder fehlgeschlagen ist. Per Konvention zeigt ein Rückgabecode (RC) von 0 (Null) einen Erfolg an und jede positive Zahl zeigt einen Fehler an. Einige Sysadmin-Tools geben nur eine 1 zurück, um einen Fehler anzuzeigen, aber viele verwenden andere positive numerische Codes, um die Art des Fehlers anzuzeigen.

Das $? der Bash-Shell Variable kann sehr einfach durch ein Skript, durch den nächsten Befehl in einer Befehlsliste oder sogar direkt durch einen Systemadministrator überprüft werden. Schauen wir uns die RCs an. Wir können einen einfachen Befehl ausführen und sofort den RC überprüfen, der sich immer auf den zuletzt ausgeführten Befehl bezieht.

[student@studentvm1 ~]$ ll ; echo "RC = $?"
total 284
-rw-rw-r--  1 student student   130 Sep 15 16:21 ascii-program.sh
drwxrwxr-x  2 student student  4096 Nov 10 11:09 bin
<snip>
drwxr-xr-x. 2 student student  4096 Aug 18 10:21 Videos
RC = 0
[student@studentvm1 ~]$

Dieser RC ist 0, was bedeutet, dass der Befehl erfolgreich abgeschlossen wurde. Probieren Sie jetzt denselben Befehl in einem Verzeichnis aus, in dem wir keine Berechtigungen haben.

[student@studentvm1 ~]$ ll /root ; echo "RC = $?"
ls: cannot open directory '/root': Permission denied
RC = 2
[student@studentvm1 ~]$

Die Bedeutung dieses RC finden Sie im ls Manpage des Befehls.

Versuchen wir es mit && Steueroperator, wie er in einem Befehlszeilenprogramm verwendet werden könnte. Wir beginnen mit etwas Einfachem:Erstellen Sie ein neues Verzeichnis und, wenn das erfolgreich ist, eine neue Datei darin.

Wir brauchen ein Verzeichnis, in dem wir andere Verzeichnisse erstellen können. Erstellen Sie zunächst ein temporäres Verzeichnis in Ihrem Home-Verzeichnis, wo Sie einige Tests durchführen können.

[student@studentvm1 ~]$ cd ; mkdir testdir

Erstellen Sie ein neues Verzeichnis in ~/testdir , die leer sein sollte, weil Sie sie gerade erstellt haben, und erstellen Sie dann eine neue, leere Datei in diesem neuen Verzeichnis. Der folgende Befehl erledigt diese Aufgaben.

[student@studentvm1 ~]$ mkdir ~/testdir/testdir2 && touch ~/testdir/testdir2/testfile1 
[student@studentvm1 ~]$ ll ~/testdir/testdir2/
total 0
-rw-rw-r-- 1 student student 0 Nov 12 14:13 testfile1
[student@studentvm1 ~]$

Wir wissen, dass alles so funktioniert hat, wie es sollte, weil die testdir Verzeichnis ist zugänglich und beschreibbar. Ändern Sie die Berechtigungen für testdir damit ist es für den Benutzer student nicht mehr zugänglich wie folgt:

[student@studentvm1 ~]$ chmod 076 testdir ; ll | grep testdir
d---rwxrw-. 3 student student  4096 Nov 12 14:13 testdir
[student@studentvm1 ~]$

Mit dem grep Befehl nach der langen Liste (ll ) zeigt die Auflistung für testdir . Sie können sehen, dass der Benutzer Student hat keinen Zugriff mehr auf das testdir Verzeichnis. Lassen Sie uns jetzt fast denselben Befehl wie zuvor ausführen, aber ändern Sie ihn, um einen anderen Verzeichnisnamen innerhalb von testdir zu erstellen .

[student@studentvm1 ~]$ mkdir ~/testdir/testdir3 && touch ~/testdir/testdir3/testfile1 
mkdir: cannot create directory ‘/home/student/testdir/testdir3’: Permission denied
[student@studentvm1 ~]$

Obwohl wir eine Fehlermeldung erhalten haben, verwenden wir && Kontrolloperator verhindert die Berührung Befehl nicht ausgeführt, da beim Erstellen von testdir3 ein Fehler aufgetreten ist . Diese Art der logischen Befehlszeilen-Flusskontrolle kann verhindern, dass sich Fehler zusammensetzen und ein echtes Durcheinander verursachen. Aber machen wir es etwas komplizierter.

Das || Der Steueroperator ermöglicht es uns, einen weiteren Befehl hinzuzufügen, der ausgeführt wird, wenn die anfängliche Programmanweisung einen Code größer als Null zurückgibt.

[student@studentvm1 ~]$ mkdir ~/testdir/testdir3 && touch ~/testdir/testdir3/testfile1 || echo "An error occurred while creating the directory."
mkdir: cannot create directory ‘/home/student/testdir/testdir3’: Permission denied
An error occurred while creating the directory.
[student@studentvm1 ~]$

Unsere zusammengesetzte Befehlssyntax mit Flusssteuerung nimmt diese allgemeine Form an, wenn wir && verwenden und || Steuerungsoperatoren:

preceding commands ; command1 && command2 || command3 ; following commands

Dem zusammengesetzten Befehl, der die Steueroperatoren verwendet, können andere Befehle vorausgehen und folgen, die mit denen im Flusssteuerungsabschnitt verwandt sein können, aber von der Flusssteuerung nicht betroffen sind. Alle diese Befehle werden ohne Rücksicht auf alles ausgeführt, was innerhalb des zusammengesetzten Befehls zur Flusssteuerung stattfindet.

Diese Flusssteuerungsoperatoren können die Arbeit an der Befehlszeile effizienter gestalten, indem sie Entscheidungen treffen und uns benachrichtigen, wenn ein Problem aufgetreten ist. Ich verwende sie sowohl direkt auf der Kommandozeile als auch in Skripten.

Sie können als Root-Benutzer aufräumen, um das Verzeichnis und seinen Inhalt zu löschen.

[root@studentvm1 ~]# rm -rf /home/student/testdir

Wie verwenden Sie Bash-Steuerungsoperatoren? Lass es uns im Kommentarbereich wissen.


Linux
  1. Überwachen Sie Befehle und Aufgaben mit dem Linux-Überwachungsbefehl

  2. Der Unterschied zwischen den Bash-Operatoren [[ Vs [ Vs ( Vs ((?

  3. Bash-Skript mit `set -e` stoppt nicht beim Befehl `… &&…`?

  4. Rm-Befehl im Bash-Skript funktioniert nicht mit Variablen?

  5. So erstellen Sie eine CPU-Spitze mit einem Bash-Befehl

So korrigieren Sie einfach falsch geschriebene Bash-Befehle in Linux

Bash Echo-Befehl mit Beispielen in Linux erklärt

Bash-Scripting – Printf-Befehl mit Beispielen erklärt

Steuern Sie die Systemressourcennutzung mit dem Ulimit-Befehl

Retten Sie erfolgreich den Tag mit Bash-Verlaufsbefehlen

Führen Sie Befehle mit einem Zeitlimit in Ubuntu 20.04 aus