Der Begriff „Shell-Scripting“ wird in Linux-Foren oft erwähnt, aber viele Benutzer sind damit nicht vertraut. Das Erlernen dieser einfachen und leistungsstarken Programmiermethode kann Ihnen helfen, Zeit zu sparen, die Befehlszeile besser zu erlernen und mühsame Dateiverwaltungsaufgaben zu vermeiden.
Was ist Shell-Scripting?
Ein Linux-Benutzer zu sein bedeutet, dass Sie mit der Befehlszeile herumspielen. Ob es Ihnen gefällt oder nicht, es gibt nur einige Dinge, die über diese Schnittstelle viel einfacher zu erledigen sind als durch Zeigen und Klicken. Je mehr Sie die Befehlszeile verwenden und lernen, desto mehr erkennen Sie ihr Potenzial. Nun, die Befehlszeile selbst ist ein Programm: die Shell. Die meisten Linux-Distributionen verwenden heute Bash, und hierin geben Sie wirklich Befehle ein.
Einige von Ihnen, die vor der Verwendung von Linux Windows verwendet haben, erinnern sich vielleicht an Batch-Dateien. Dies waren kleine Textdateien, die Sie mit Befehlen zum Ausführen füllen konnten und die Windows nacheinander ausführen würde. Es war eine clevere und saubere Möglichkeit, einige Dinge zu erledigen, z. B. Spiele in Ihrem Computerraum der High School auszuführen, wenn Sie keine Systemordner öffnen oder Verknüpfungen erstellen konnten. Batch-Dateien in Windows sind zwar nützlich, aber eine billige Nachahmung von Shell-Skripten.

Shell-Skripte ermöglichen es uns, Befehle in Ketten zu programmieren und vom System als skriptgesteuertes Ereignis ausführen zu lassen, genau wie Batch-Dateien. Sie ermöglichen auch weitaus nützlichere Funktionen wie die Befehlsersetzung. Sie können einen Befehl wie date aufrufen und seine Ausgabe als Teil eines Dateibenennungsschemas verwenden. Sie können Backups automatisieren und jeder kopierten Datei kann das aktuelle Datum an das Ende ihres Namens angehängt werden. Skripte sind auch nicht nur Aufrufe von Befehlen. Sie sind eigene Programme. Mithilfe von Skripten können Sie Programmierfunktionen – wie „for“-Schleifen, if/then/else-Anweisungen usw. – direkt in der Benutzeroberfläche Ihres Betriebssystems verwenden. Und Sie müssen keine weitere Sprache lernen, weil Sie das verwenden, was Sie bereits kennen: die Befehlszeile.
Das ist wirklich die Macht des Scriptings, denke ich. Sie können mit Befehlen programmieren, die Sie bereits kennen, während Sie die wichtigsten Programmiersprachen lernen. Müssen Sie etwas sich wiederholendes und mühsames tun? Schreiben Sie es! Benötigen Sie eine Verknüpfung für einen wirklich komplizierten Befehl? Schreiben Sie es! Möchten Sie eine wirklich einfach zu verwendende Befehlszeilenschnittstelle für etwas erstellen? Schreiben Sie es!
Bevor Sie beginnen
Bevor wir mit unserer Skriptserie beginnen, wollen wir einige grundlegende Informationen behandeln. Wir verwenden die Bash-Shell, die die meisten Linux-Distributionen nativ verwenden. Bash ist auch für Mac OS-Benutzer und Cygwin unter Windows verfügbar. Da es so universell ist, sollten Sie unabhängig von Ihrer Plattform in der Lage sein, Skripte zu erstellen. Solange alle Befehle, auf die verwiesen wird, vorhanden sind, können Skripte außerdem auf mehreren Plattformen mit wenig bis gar keinen Anpassungen ausgeführt werden.
Bei der Skripterstellung können problemlos „Administrator“- oder „Superuser“-Rechte verwendet werden, daher ist es am besten, Skripte zu testen, bevor Sie sie einsetzen. Verwenden Sie auch Ihren gesunden Menschenverstand, z. B. stellen Sie sicher, dass Sie Sicherungskopien der Dateien haben, für die Sie ein Skript ausführen möchten. Es ist auch sehr wichtig, die richtigen Optionen wie –i für den rm-Befehl zu verwenden, damit Ihre Interaktion erforderlich ist. Dies kann einige böse Fehler verhindern. Lesen Sie sich daher die heruntergeladenen Skripte durch und gehen Sie vorsichtig mit Ihren Daten um, nur für den Fall, dass etwas schief geht.
Im Kern sind Skripte nur einfache Textdateien. Sie können jeden Texteditor verwenden, um sie zu schreiben: gedit, emacs, vim, nano… Diese Liste geht weiter. Achten Sie nur darauf, dass Sie es als Nur-Text speichern, nicht als Rich-Text oder als Word-Dokument. Da ich die Benutzerfreundlichkeit von Nano liebe, werde ich sie verwenden.
Skriptberechtigungen und -namen
Skripte werden wie Programme ausgeführt und benötigen dazu die entsprechenden Berechtigungen. Sie können Skripte ausführbar machen, indem Sie den folgenden Befehl darauf ausführen:
chmod +x ~/somecrazyfolder/script1
Dadurch kann jeder dieses bestimmte Skript ausführen. Wenn Sie die Verwendung auf nur Ihren Benutzer beschränken möchten, können Sie stattdessen Folgendes verwenden:
chmod u+x ~/somecrazyfolder/script1
Um dieses Skript auszuführen, müssen Sie in das richtige Verzeichnis cd und dann das Skript wie folgt ausführen:
cd ~/somecrazyfolder
./script1
Um es bequemer zu machen, können Sie Skripte in einem „bin“-Ordner in Ihrem Home-Verzeichnis ablegen:
~/bin
In vielen modernen Distributionen wird dieser Ordner nicht mehr standardmäßig erstellt, aber Sie können ihn erstellen. Hier werden normalerweise ausführbare Dateien gespeichert, die Ihrem Benutzer und nicht anderen Benutzern gehören. Indem Sie Skripte hier platzieren, können Sie sie einfach ausführen, indem Sie ihren Namen eingeben, genau wie andere Befehle, anstatt herumlaufen zu müssen und das Präfix ‘./’ zu verwenden.
Bevor Sie ein Skript benennen, sollten Sie jedoch den folgenden Befehl ausführen, um zu überprüfen, ob ein Programm installiert ist, das diesen Namen verwendet:
welcher [command]
Viele Leute nennen ihre frühen Skripte „Test“, und wenn sie versuchen, sie in der Befehlszeile auszuführen, passiert nichts. Dies liegt daran, dass es mit dem Testbefehl kollidiert, der ohne Argumente nichts tut. Stellen Sie immer sicher, dass Ihre Skriptnamen nicht mit Befehlen in Konflikt geraten, da Sie sonst möglicherweise Dinge tun, die Sie nicht tun möchten!
Skriptrichtlinien

Wie ich bereits erwähnt habe, besteht jede Skriptdatei im Wesentlichen aus Klartext. Das bedeutet jedoch nicht, dass Sie wohl oder übel schreiben können, was Sie wollen. Wenn versucht wird, eine Textdatei auszuführen, durchsuchen die Shells sie nach Hinweisen, ob es sich um Skripte handelt oder nicht und wie alles richtig zu handhaben ist. Aus diesem Grund gibt es einige Richtlinien, die Sie kennen müssen.
- Jedes Skript sollte «#!/bin/bash» enthalten.
- Jede neue Zeile ist ein neuer Befehl
- Kommentarzeilen beginnen mit einem #
- Befehle sind von () umgeben
Der Hash-Bang-Hack
Wenn eine Shell eine Textdatei durchsucht, ist der direkteste Weg, die Datei als Skript zu identifizieren, die erste Zeile:
#!/bin/bash
Wenn Sie eine andere Shell verwenden, ersetzen Sie deren Pfad hier. Kommentarzeilen beginnen mit Hashes (#), aber das Hinzufügen des Knalls (!) und des Shell-Pfads danach ist eine Art Hack, der diese Kommentarregel umgeht und das Skript dazu zwingt, mit der Shell auszuführen, auf die diese Zeile zeigt.
Neue Zeile = Neuer Befehl
Jede neue Zeile sollte als neuer Befehl oder als Bestandteil eines größeren Systems betrachtet werden. If/then/else-Anweisungen übernehmen beispielsweise mehrere Zeilen, aber jede Komponente dieses Systems steht in einer neuen Zeile. Lassen Sie einen Befehl nicht in die nächste Zeile übergehen, da dies den vorherigen Befehl abschneiden und Ihnen in der nächsten Zeile einen Fehler anzeigen kann. Wenn Ihr Texteditor dies tut, sollten Sie den Textumbruch sicherheitshalber deaktivieren. Sie können den Textumbruch in Nanobit deaktivieren, indem Sie ALT+L drücken.
Kommentiere oft mit #s
Wenn Sie eine Zeile mit einem # beginnen, wird die Zeile ignoriert. Dadurch wird es zu einer Kommentarzeile, in der Sie sich daran erinnern können, was die Ausgabe des vorherigen Befehls war oder was der nächste Befehl tun wird. Deaktivieren Sie auch hier den Textumbruch oder teilen Sie Ihren Kommentar in mehrere Zeilen auf, die alle mit einem Hash beginnen. Es ist eine gute Praxis, viele Kommentare zu verwenden, da Sie und andere damit Ihre Skripte einfacher optimieren können. Die einzige Ausnahme ist der oben erwähnte Hash-Bang-Hack, also folgen Sie nicht #s mit !s. 😉
Befehle sind von Klammern umgeben
In früheren Zeiten wurden Befehlsersetzungen mit einzelnen Häkchen durchgeführt (`, teilt die ~-Taste). Wir werden dies noch nicht ansprechen, aber da die meisten Leute nach dem Erlernen der Grundlagen auf Erkundungstour gehen, ist es wahrscheinlich eine gute Idee zu erwähnen, dass Sie stattdessen Klammern verwenden sollten. Dies liegt hauptsächlich daran, dass Klammern besser funktionieren, wenn Sie verschachteln – Befehle in andere Befehle einfügen.
Dein erstes Skript
Beginnen wir mit einem einfachen Skript, mit dem Sie Dateien kopieren und Datumsangaben am Ende des Dateinamens anhängen können. Nennen wir es „datecp“. Lassen Sie uns zunächst überprüfen, ob dieser Name mit etwas in Konflikt steht:

Wie Sie sehen, gibt es keine Ausgabe des Befehls which, also sind wir bereit, diesen Namen zu verwenden.
Erstellen wir eine leere Datei im Ordner ~/bin:
Tippen Sie auf ~/bin/datecp

Und ändern wir jetzt die Berechtigung, bevor wir es vergessen:

Beginnen wir dann mit der Erstellung unseres Skripts. Öffnen Sie diese Datei in Ihrem Texteditor Ihrer Wahl. Wie gesagt, ich mag die Einfachheit von Nano.
nano ~/bin/datecp
Und lassen Sie uns fortfahren und die erste Voraussetzungszeile und einen Kommentar dazu eingeben, was dieses Skript macht.

Als nächstes deklarieren wir eine Variable. Wenn Sie jemals Algebra genommen haben, wissen Sie wahrscheinlich, was das ist. Eine Variable ermöglicht es uns, Informationen zu speichern und Dinge damit zu tun. Variablen können „erweitern“, wenn sie an anderer Stelle referenziert werden. Das heißt, anstatt ihren Namen anzuzeigen, zeigen sie ihre gespeicherten Inhalte an. Sie können später derselben Variablen mitteilen, dass sie andere Informationen speichern soll, und jede Anweisung, die danach erfolgt, verwendet die neuen Informationen. Es ist wirklich schick Platzhalter.
Was werden wir in die Variable ausgeben? Nun, speichern wir das Datum und die Uhrzeit! Dazu rufen wir den date-Befehl auf.
Sehen Sie sich den Screenshot unten an, um zu erfahren, wie Sie die Ausgabe des Datumsbefehls erstellen:

Sie können sehen, dass Sie die Ausgabe des Befehls nach Belieben ändern können, indem Sie verschiedene Variablen hinzufügen, die mit % beginnen. Weitere Informationen finden Sie auf der Handbuchseite für den date-Befehl.
Lassen Sie uns die letzte Iteration des Datumsbefehls «date +%m_%d_%y-%H.%M.%S» verwenden und in unserem Skript verwenden.

Wenn wir dieses Skript jetzt speichern würden, könnten wir es ausführen und es würde uns die Ausgabe des Datumsbefehls geben, wie wir es erwarten würden:

Aber machen wir etwas anderes. Geben wir diesem Befehl einen Variablennamen wie date_formatted. Die richtige Syntax dafür lautet wie folgt:
variable=$(Befehl –Optionen Argumente)
Und für uns würden wir es so bauen:
date_formatted=$(Datum +%m_%d_%y-%H.%M.%S)

Dies nennen wir Befehlsersetzung. Wir sagen der bash im Wesentlichen, dass sie den Befehl in Klammern ausführen soll, wenn die Variable „date_formatted“ auftaucht. Dann sollte die Ausgabe der Befehle anstelle des Variablennamens „date_formatted“ angezeigt werden.
Hier ist ein Beispielskript und seine Ausgabe:


Beachten Sie, dass die Ausgabe zwei Leerzeichen enthält. Sowohl das Leerzeichen in den Anführungszeichen des echo-Befehls als auch das Leerzeichen vor der Variablen werden angezeigt. Verwenden Sie keine Leerzeichen, wenn sie nicht angezeigt werden sollen. Beachten Sie auch, dass das Skript ohne diese hinzugefügte „echo“ -Zeile absolut keine Ausgabe ausgeben würde.
Kommen wir zurück zu unserem Skript. Als nächstes fügen wir den Kopierteil des Befehls hinzu.
cp –iv $1 $2.$date_formatted

Dadurch wird der Kopierbefehl mit den Optionen –i und –v aufgerufen. Ersteres („interaktiv“) fordert Sie zur Überprüfung auf, bevor eine Datei überschrieben wird, und letzteres („verbose“) zeigt auf der Befehlszeile an, was getan wird.
Als Nächstes sehen Sie, dass ich die Option «$1» hinzugefügt habe. Bei der Skripterstellung bezeichnet ein Dollarzeichen ($) gefolgt von einer Zahl das nummerierte Argument des Skripts, als es aufgerufen wurde. Zum Beispiel im folgenden Befehl:
cp –iv Trogdor2.mp3 ringtone.mp3
Das erste Argument ist „Trogdor2.mp3“ und das zweite Argument ist „Klingelton.mp3“.
Wenn wir auf unser Skript zurückblicken, können wir sehen, dass wir auf zwei Argumente verweisen:

Das bedeutet, dass wir beim Ausführen des Skripts zwei Argumente angeben müssen, damit das Skript korrekt ausgeführt wird. Das erste Argument, $1, ist die Datei, die kopiert wird, und wird als erstes Argument des Befehls „cp –iv“ ersetzt.
Das zweite Argument, $2, fungiert als Ausgabedatei für denselben Befehl. Aber man sieht auch, dass es anders ist. Wir haben einen Punkt hinzugefügt und auf die Variable „date_formatted“ von oben verwiesen. Neugierig, was das bewirkt?
Folgendes passiert, wenn das Skript ausgeführt wird:

Sie können sehen, dass die Ausgabedatei als das angezeigt wird, was ich für $2 eingegeben habe, gefolgt von einem Punkt und dann der Ausgabe des Datumsbefehls! Macht Sinn, oder?
Wenn ich jetzt den Befehl datecp ausführe, wird dieses Skript ausgeführt und ich kann jede Datei an einen neuen Speicherort kopieren und automatisch Datum und Uhrzeit am Ende des Dateinamens hinzufügen. Nützlich für die Archivierung von Sachen!
Shell-Skripting ist das Herzstück, damit Ihr Betriebssystem für Sie arbeitet. Sie müssen auch keine neue Programmiersprache lernen, um dies zu erreichen. Versuchen Sie zu Hause mit einigen grundlegenden Befehlen Skripte zu erstellen und überlegen Sie, wofür Sie dies verwenden können.
Drehst du? Haben Sie Tipps für Neulinge? Teile deine Gedanken in den Kommentaren! In dieser Serie kommt noch mehr!