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

Programmieren mit Bash:Syntax und Tools

Eine Shell ist der Befehlsinterpreter für das Betriebssystem. Bash ist meine Lieblings-Shell, aber jede Linux-Shell interpretiert die vom Benutzer oder Systemadministrator eingegebenen Befehle in einer Form, die das Betriebssystem verwenden kann. Wenn die Ergebnisse an das Shell-Programm zurückgegeben werden, sendet es sie an STDOUT, das sie standardmäßig im Terminal anzeigt. Alle mir bekannten Shells sind auch Programmiersprachen.

Funktionen wie Tab-Vervollständigung, Befehlszeilen-Aufruf und -Bearbeitung sowie Verknüpfungen wie Aliase tragen alle zu seinem Wert als leistungsstarke Shell bei. Der standardmäßige Befehlszeilen-Bearbeitungsmodus verwendet Emacs, aber eine meiner Lieblingsfunktionen von Bash ist, dass ich ihn in den Vi-Modus ändern kann, um Bearbeitungsbefehle zu verwenden, die bereits Teil meines Muskelgedächtnisses sind.

Wenn Sie Bash jedoch nur als Shell betrachten, entgeht Ihnen viel von seiner wahren Kraft. Bei der Recherche für meinen dreibändigen Linux-Selbstlernkurs (auf dem diese Artikelserie basiert) habe ich Dinge über Bash gelernt, die ich in über 20 Jahren Arbeit mit Linux nie gewusst hatte. Einige dieser neuen Erkenntnisse beziehen sich auf die Verwendung als Programmiersprache. Bash ist eine leistungsstarke Programmiersprache, die perfekt für die Verwendung auf der Befehlszeile und in Shell-Skripten entwickelt wurde.

Diese dreiteilige Serie untersucht die Verwendung von Bash als Programmiersprache für die Befehlszeilenschnittstelle (CLI). Dieser erste Artikel befasst sich mit einfacher Befehlszeilenprogrammierung mit Bash, Variablen und Steueroperatoren. In den anderen Artikeln werden Arten von Bash-Dateien untersucht. Zeichenfolgen-, numerische und verschiedene logische Operatoren, die eine Ablaufsteuerungslogik bereitstellen; verschiedene Arten von Shell-Erweiterungen; und das für , während , und bis Schleifen, die sich wiederholende Operationen ermöglichen. Sie werden sich auch einige Befehle ansehen, die die Verwendung dieser Tools vereinfachen und unterstützen.

Die Schale

Eine Shell ist der Befehlsinterpreter für das Betriebssystem. Bash ist meine Lieblings-Shell, aber jede Linux-Shell interpretiert die vom Benutzer oder Systemadministrator eingegebenen Befehle in einer Form, die das Betriebssystem verwenden kann. Wenn die Ergebnisse an das Shell-Programm zurückgegeben werden, zeigt es sie im Terminal an. Alle mir bekannten Shells sind auch Programmiersprachen.

Bash steht für Bourne Again Shell, weil die Bash-Shell auf der älteren Bourne-Shell basiert, die 1977 von Steven Bourne geschrieben wurde. Viele andere Shells sind verfügbar, aber diese vier begegnen mir am häufigsten:

  • csh: Die C-Shell für Programmierer, die die Syntax der Sprache C mögen
  • ksh: Die Korn-Shell, geschrieben von David Korn und beliebt bei Unix-Benutzern
  • tcsh: Eine Version von csh mit benutzerfreundlicheren Funktionen
  • zsh: Die Z-Shell, die viele Features anderer beliebter Shells vereint

Alle Shells verfügen über integrierte Befehle, die die von den Kerndienstprogrammen bereitgestellten ergänzen oder ersetzen. Öffnen Sie die Manpage der Shell und suchen Sie den Abschnitt "BUILT-INS", um die bereitgestellten Befehle zu sehen.

Jede Shell hat ihre eigene Persönlichkeit und Syntax. Einige werden für Sie besser funktionieren als andere. Ich habe die C-Shell, die Korn-Shell und die Z-Shell verwendet. Ich mag die Bash-Shell immer noch mehr als alle anderen. Verwenden Sie diejenige, die für Sie am besten geeignet ist, obwohl Sie möglicherweise einige der anderen ausprobieren müssen. Glücklicherweise ist es ziemlich einfach, die Muscheln zu wechseln.

Alle diese Shells sind sowohl Programmiersprachen als auch Befehlsinterpreter. Hier ist ein kurzer Überblick über einige Programmierkonstrukte und -werkzeuge, die integrale Bestandteile von Bash sind.

Bash als Programmiersprache

Die meisten Systemadministratoren haben Bash verwendet, um Befehle auszugeben, die normalerweise ziemlich einfach und unkompliziert sind. Aber Bash kann über die Eingabe einzelner Befehle hinausgehen, und viele Systemadministratoren erstellen einfache Befehlszeilenprogramme, um eine Reihe von Aufgaben auszuführen. Diese Programme sind gängige Tools, die Zeit und Mühe sparen können.

Mein Ziel beim Schreiben von CLI-Programmen ist es, Zeit und Mühe zu sparen (d. h. der faule Systemadministrator zu sein). CLI-Programme unterstützen dies, indem sie mehrere Befehle in einer bestimmten Reihenfolge auflisten, die nacheinander ausgeführt werden, sodass Sie den Fortschritt eines Befehls nicht beobachten und den nächsten Befehl eingeben müssen, wenn der erste beendet ist. Sie können andere Dinge erledigen und müssen nicht ständig den Fortschritt jedes Befehls überwachen.

Was ist "ein Programm"?

Das Free Online Dictionary of Computing (FOLDOC) definiert ein Programm als:„Die Anweisungen, die von einem Computer ausgeführt werden, im Gegensatz zu dem physischen Gerät, auf dem sie ausgeführt werden.“ Das WordNet der Princeton University definiert ein Programm als:„…eine Folge von Anweisungen, die ein Computer interpretieren und ausführen kann…“ Wikipedia hat auch einen guten Eintrag über Computerprogramme.

Daher kann ein Programm aus einer oder mehreren Anweisungen bestehen, die eine bestimmte, verwandte Aufgabe ausführen. Eine Computerprogrammanweisung wird auch als Programmanweisung bezeichnet. Für Systemadministratoren ist ein Programm normalerweise eine Folge von Shell-Befehlen. Alle für Linux verfügbaren Shells, zumindest die mir bekannten, haben zumindest eine grundlegende Form der Programmierfähigkeit, und Bash, die Standard-Shell für die meisten Linux-Distributionen, ist keine Ausnahme.

Während diese Serie Bash verwendet (weil es so allgegenwärtig ist), sind die allgemeinen Programmierkonzepte dieselben, wenn Sie eine andere Shell verwenden, obwohl sich die Konstrukte und die Syntax etwas unterscheiden können. Einige Shells unterstützen möglicherweise einige Funktionen, die andere nicht unterstützen, aber alle bieten Programmierfähigkeiten. Shell-Programme können zur wiederholten Verwendung in einer Datei gespeichert oder bei Bedarf auf der Befehlszeile erstellt werden.

Einfache CLI-Programme

Die einfachsten Kommandozeilenprogramme sind ein oder zwei aufeinanderfolgende Programmanweisungen, die zusammenhängend sein können oder nicht, die auf der Kommandozeile vor der Enter eingegeben werden Taste gedrückt wird. Die zweite Anweisung in einem Programm, falls vorhanden, kann von den Aktionen der ersten abhängig sein, muss es aber nicht.

Es gibt auch ein bisschen syntaktische Interpunktion, die klar angegeben werden muss. Drücken Sie bei der Eingabe eines einzelnen Befehls in der Befehlszeile die Eingabetaste Taste beendet den Befehl mit einem impliziten Semikolon (; ). Bei Verwendung in einem CLI-Shell-Programm, das als einzelne Zeile in der Befehlszeile eingegeben wird, muss das Semikolon verwendet werden, um jede Anweisung abzuschließen und von der nächsten zu trennen. Die letzte Anweisung in einem CLI-Shell-Programm kann ein explizites oder implizites Semikolon verwenden.

Einige grundlegende Syntax

Die folgenden Beispiele verdeutlichen diese Syntax. Dieses Programm besteht aus einem einzigen Befehl mit einem expliziten Abschlusszeichen:

[student@studentvm1 ~]$ echo "Hello world." ;
Hello world.

Das mag nicht wie ein großes Programm erscheinen, aber es ist das erste Programm, dem ich mit jeder neuen Programmiersprache begegne, die ich lerne. Die Syntax kann für jede Sprache etwas anders sein, aber das Ergebnis ist dasselbe.

Lassen Sie uns dieses triviale, aber allgegenwärtige Programm ein wenig erweitern. Ihre Ergebnisse werden sich von meinen unterscheiden, weil ich andere Experimente durchgeführt habe, während Sie möglicherweise nur die Standardverzeichnisse und -dateien haben, die im Home-Verzeichnis des Kontos erstellt werden, wenn Sie sich zum ersten Mal über den GUI-Desktop bei einem Konto anmelden.

[student@studentvm1 ~]$ echo "My home directory." ; ls ;
My home directory.
chapter25   TestFile1.Linux  dmesg2.txt  Downloads  newfile.txt  softlink1  testdir6
chapter26   TestFile1.mac    dmesg3.txt  file005    Pictures     Templates  testdir
TestFile1      Desktop       dmesg.txt   link3      Public       testdir    Videos
TestFile1.dos  dmesg1.txt    Documents   Music      random.txt   testdir1

Das macht etwas mehr Sinn. Die Ergebnisse hängen zusammen, die einzelnen Programmanweisungen sind jedoch unabhängig voneinander. Beachten Sie, dass ich gerne Leerzeichen vor und nach dem Semikolon setze, weil es den Code etwas leichter lesbar macht. Probieren Sie dieses kleine CLI-Programm noch einmal ohne explizites Semikolon am Ende aus:

[student@studentvm1 ~]$ echo "My home directory." ; ls 

Es gibt keinen Unterschied in der Ausgabe.

Etwas über Variablen

Wie alle Programmiersprachen kann die Bash-Shell mit Variablen umgehen. Eine Variable ist ein symbolischer Name, der sich auf eine bestimmte Stelle im Speicher bezieht, die einen bestimmten Wert enthält. Der Wert einer Variablen ist änderbar, d.h. er ist variabel.

Bash typisiert keine Variablen wie C und verwandte Sprachen und definiert sie als Ganzzahlen, Gleitkommazahlen oder Zeichenfolgentypen. In Bash sind alle Variablen Strings. Ein ganzzahliger String kann in der ganzzahligen Arithmetik verwendet werden, was die einzige Art von Mathematik ist, die Bash ausführen kann. Wenn komplexere Mathematik erforderlich ist, wird das bc Der Befehl kann in CLI-Programmen und Skripten verwendet werden.

Variablen werden Werte zugewiesen und sie können verwendet werden, um in CLI-Programmen und -Skripten auf diese Werte zu verweisen. Der Wert einer Variablen wird anhand ihres Namens festgelegt, jedoch ohne vorangestelltes $ Schild. Die Zuweisung VAR=10 setzt den Wert der Variablen VAR auf 10. Um den Wert der Variablen auszudrucken, können Sie die Anweisung echo $VAR verwenden . Beginnen Sie mit Textvariablen (d. h. nicht numerischen Variablen).

Bash-Variablen werden Teil der Shell-Umgebung, bis sie aufgehoben werden.

Überprüfen Sie den Anfangswert einer nicht zugewiesenen Variablen; es sollte null sein. Weisen Sie dann der Variablen einen Wert zu und drucken Sie sie aus, um ihren Wert zu überprüfen. Sie können all dies in einem einzigen CLI-Programm erledigen:

[student@studentvm1 ~]$ echo $MyVar ; MyVar="Hello World" ; echo $MyVar ;

Hello World
[student@studentvm1 ~]$

Hinweis:Die Syntax der Variablenzuweisung ist sehr streng. Auf beiden Seiten der Gleichheit dürfen keine Leerzeichen stehen (= ) Unterschreiben Sie die Abtretungserklärung.

Die leere Zeile zeigt an, dass der Anfangswert von MyVar ist Null. Das Ändern und Setzen des Wertes einer Variablen erfolgt auf die gleiche Weise. Dieses Beispiel zeigt sowohl den ursprünglichen als auch den neuen Wert.

Wie bereits erwähnt, kann Bash ganzzahlige arithmetische Berechnungen durchführen, was nützlich ist, um einen Verweis auf die Position eines Elements in einem Array zu berechnen oder einfache mathematische Probleme zu lösen. Es ist nicht geeignet für wissenschaftliches Rechnen oder alles, was Dezimalzahlen erfordert, wie z. B. Finanzberechnungen. Es gibt viel bessere Tools für diese Art von Berechnungen.

Hier ist eine einfache Berechnung:

[student@studentvm1 ~]$ Var1="7" ; Var2="9" ; echo "Result = $((Var1*Var2))"
Result = 63

Was passiert, wenn Sie eine mathematische Operation ausführen, die zu einer Gleitkommazahl führt?

[student@studentvm1 ~]$ Var1="7" ; Var2="9" ; echo "Result = $((Var1/Var2))"
Result = 0
[student@studentvm1 ~]$ Var1="7" ; Var2="9" ; echo "Result = $((Var2/Var1))"
Result = 1
[student@studentvm1 ~]$

Das Ergebnis ist die nächste Ganzzahl. Beachten Sie, dass die Berechnung als Teil des Echos durchgeführt wurde Erklärung. Die Mathematik wird aufgrund der Bash-Rangordnung vor dem einschließenden echo-Befehl ausgeführt. Einzelheiten finden Sie auf der Bash-Manpage und suchen Sie nach „precedence.“

Steuerungsoperatoren

Shell-Steuerungsoperatoren sind einer der syntaktischen Operatoren zum einfachen Erstellen einiger interessanter Befehlszeilenprogramme. Die einfachste Form eines CLI-Programms besteht darin, mehrere Befehle in einer Sequenz auf der Befehlszeile aneinanderzureihen:

command1 ; command2 ; command3 ; command4 ; . . . ; etc. ;

Diese Befehle laufen alle ohne Probleme, solange keine Fehler auftreten. Aber was passiert, wenn ein Fehler auftritt? Mit dem integrierten && können Sie Fehler antizipieren und zulassen und || Bash-Steuerungsoperatoren. Diese beiden Steuerungsoperatoren bieten eine gewisse Flusssteuerung und ermöglichen es Ihnen, die Reihenfolge der Codeausführung zu ändern. Das Semikolon wird ebenso wie das Zeilenumbruchzeichen als Bash-Kontrolloperator betrachtet.

Das && Der Operator sagt einfach:"Wenn Befehl1 erfolgreich ist, führen Sie Befehl2 aus. Wenn Befehl1 aus irgendeinem Grund fehlschlägt, wird Befehl2 übersprungen." Diese Syntax sieht folgendermaßen aus:

command1 && command2

Sehen Sie sich nun einige Befehle an, die ein neues Verzeichnis erstellen und es – wenn es erfolgreich ist – zum aktuellen Arbeitsverzeichnis (PWD) machen. Stellen Sie sicher, dass Ihr Home-Verzeichnis (~ ) ist die PWD. Versuchen Sie dies zuerst in /root , ein Verzeichnis, auf das Sie keinen Zugriff haben:

[student@studentvm1 ~]$ Dir=/root/testdir ; mkdir $Dir/ && cd $Dir
mkdir: cannot create directory '/root/testdir/': Permission denied
[student@studentvm1 ~]$

Der Fehler wurde von mkdir ausgegeben Befehl. Sie haben keinen Fehler erhalten, der darauf hinweist, dass die Datei nicht erstellt werden konnte, weil die Erstellung des Verzeichnisses fehlgeschlagen ist. Das && Kontrolloperator hat den Rückgabecode ungleich Null erkannt, also die Berührung Befehl wurde übersprungen. Mit && Kontrolloperator verhindert die Berührung Befehl nicht ausgeführt, da beim Erstellen des Verzeichnisses ein Fehler aufgetreten ist. Diese Art der Befehlszeilen-Programmflusskontrolle kann verhindern, dass sich Fehler zusammensetzen und ein echtes Durcheinander verursachen. Aber es wird Zeit, etwas komplizierter zu werden.

Das || Mit dem Steueroperator können Sie eine weitere Programmanweisung hinzufügen, die ausgeführt wird, wenn die anfängliche Programmanweisung einen Code größer als Null zurückgibt. Die grundlegende Syntax sieht folgendermaßen aus:

command1 || command2 

Diese Syntax lautet:„Wenn Befehl1 fehlschlägt, führe Befehl2 aus.“ Das bedeutet, dass Befehl2 übersprungen wird, wenn Befehl1 erfolgreich ist. Versuchen Sie dies, indem Sie versuchen, ein neues Verzeichnis zu erstellen:

[student@studentvm1 ~]$ Dir=/root/testdir ; mkdir $Dir || echo "$Dir was not created."
mkdir: cannot create directory '/root/testdir': Permission denied
/root/testdir was not created.
[student@studentvm1 ~]$

Das ist genau das, was Sie erwarten würden. Da das neue Verzeichnis nicht erstellt werden konnte, schlug der erste Befehl fehl, was zur Ausführung des zweiten Befehls führte.

Die Kombination dieser beiden Operatoren bietet das Beste aus beiden. Die Steueroperator-Syntax, die eine Flusssteuerung verwendet, nimmt diese allgemeine Form an, wenn && und || Kontrolloperatoren werden verwendet:

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

Diese Syntax kann wie folgt angegeben werden:"Wenn Befehl1 mit einem Rückkehrcode von 0 beendet wird, dann Befehl2 ausführen, andernfalls Befehl3 ausführen." Probieren Sie es aus:

[student@studentvm1 ~]$ Dir=/root/testdir ; mkdir $Dir && cd $Dir || echo "$Dir was not created."
mkdir: cannot create directory '/root/testdir': Permission denied
/root/testdir was not created.
[student@studentvm1 ~]$

Versuchen Sie nun den letzten Befehl erneut, indem Sie Ihr Home-Verzeichnis anstelle von /root verwenden Verzeichnis. Sie haben die Berechtigung, dieses Verzeichnis zu erstellen:

[student@studentvm1 ~]$ Dir=~/testdir ; mkdir $Dir && cd $Dir || echo "$Dir was not created."
[student@studentvm1 testdir]$

Die Steueroperator-Syntax, wie Befehl1 &&Befehl2 , funktioniert, weil jeder Befehl einen Rückgabecode (RC) an die Shell sendet, der angibt, ob er erfolgreich abgeschlossen wurde oder ob während der Ausführung ein Fehler aufgetreten ist. Per Konvention zeigt ein RC von Null (0) einen Erfolg an, und jede positive Zahl zeigt eine Art Fehler an. Einige der Tools, die Systemadministratoren verwenden, geben nur eine Eins (1) zurück, um einen Fehler anzuzeigen, aber viele verwenden andere Codes, um die Art des aufgetretenen Fehlers anzuzeigen.

Die Bash-Shell-Variable $? enthält den RC vom letzten Befehl. Dieser RC kann sehr einfach durch ein Skript, den nächsten Befehl in einer Befehlsliste oder sogar den Systemadministrator direkt überprüft werden. Beginnen Sie, indem Sie einen einfachen Befehl ausführen und sofort den RC überprüfen. Der RC wird immer für den letzten Befehl sein, der ausgeführt wurde, bevor Sie ihn angesehen haben.

[student@studentvm1 testdir]$ ll ; echo "RC = $?"
total 1264
drwxrwxr-x  2 student student   4096 Mar  2 08:21 chapter25
drwxrwxr-x  2 student student   4096 Mar 21 15:27 chapter26
-rwxr-xr-x  1 student student     92 Mar 20 15:53 TestFile1
<snip>
drwxrwxr-x. 2 student student 663552 Feb 21 14:12 testdir
drwxr-xr-x. 2 student student   4096 Dec 22 13:15 Videos
RC = 0
[student@studentvm1 testdir]$

Der RC ist in diesem Fall Null, was bedeutet, dass der Befehl erfolgreich abgeschlossen wurde. Versuchen Sie nun denselben Befehl im Home-Verzeichnis von root, einem Verzeichnis, für das Sie keine Berechtigungen haben:

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

In diesem Fall ist der RC zwei; Dies bedeutet, dass einem Nicht-Root-Benutzer die Berechtigung verweigert wurde, auf ein Verzeichnis zuzugreifen, auf das der Benutzer keinen Zugriff hat. Die Steuerungsoperatoren verwenden diese RCs, um es Ihnen zu ermöglichen, die Reihenfolge der Programmausführung zu ändern.

Zusammenfassung

Dieser Artikel betrachtete Bash als Programmiersprache und untersuchte seine grundlegende Syntax sowie einige grundlegende Werkzeuge. Es zeigte, wie man Daten auf STDOUT ausgibt und wie man Variablen und Steueroperatoren verwendet. Der nächste Artikel in dieser Reihe befasst sich mit einigen der vielen logischen Bash-Operatoren, die den Ablauf der Befehlsausführung steuern.


Linux
  1. Navigieren in der Bash-Shell mit pushd und popd

  2. So analysieren und verschönern Sie JSON mit Linux-Befehlszeilentools

  3. Gewusst wie:Unbegrenzter Bash/Shell-Verlauf?

  4. Wie verwende ich die Befehle watch und jobs zusammen in Bash?

  5. Wie man einen Abschnitt einer Datei in der Bash-Shell grep

So arbeiten Sie mit File and Shell Provisioner in Vagrant

So installieren Sie Linux Bash Shell unter Windows 10

So installieren und verwenden Sie Nu Shell unter Linux

Bash If Else Syntax mit Beispielen

Bash-Skripting:So geben Sie Text in der Linux-Shell aus und formatieren ihn

Wie man ein C-Programm unter Linux schreibt und ausführt