Der Begriff „Shell-Scripting“ wird in Linux-Foren häufig 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 lernen und mühsame Dateiverwaltungsaufgaben zu erledigen.
Was ist Shell Scripting?
Als Linux-Benutzer spielen Sie mit der Befehlszeile herum. Ob es Ihnen gefällt oder nicht, es gibt nur einige Dinge, die über diese Benutzeroberfläche viel einfacher erledigt werden können als durch Zeigen und Klicken. Je mehr Sie die Befehlszeile verwenden und lernen, desto mehr sehen Sie ihr Potenzial. Nun, die Kommandozeile selbst ist ein Programm: die Shell. Die meisten Linux-Distributionen verwenden heutzutage Bash, und in diese geben Sie wirklich Befehle ein.
Einige von Ihnen, die Windows vor der Verwendung von Linux verwendet haben, erinnern sich möglicherweise an Batchdateien. Dies waren kleine Textdateien, die Sie mit auszuführenden Befehlen füllen konnten, und Windows führte sie nacheinander aus. Es war eine clevere und nette Möglichkeit, einige Dinge zu erledigen, z. B. Spiele in Ihrem Computerlabor 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.
Mit Shell-Skripten können wir Befehle in Ketten programmieren und vom System als Skriptereignis ausführen lassen, genau wie Batch-Dateien. Sie ermöglichen auch weitaus nützlichere Funktionen wie das Ersetzen von Befehlen. Sie können einen Befehl wie das Datum aufrufen und seine Ausgabe als Teil eines Dateinamenschemas verwenden. Sie können Sicherungen automatisieren und an jede kopierte Datei kann das aktuelle Datum an das Ende ihres Namens angehängt werden. Skripte sind auch nicht nur Aufrufe von Befehlen. Sie sind Programme für sich. Mit der Skripterstellung können Sie Programmierfunktionen – wie z. B. ‘for’-Schleifen, if / then / else-Anweisungen usw. – direkt in der Benutzeroberfläche Ihres Betriebssystems verwenden. Und Sie müssen keine andere Sprache lernen, weil Sie das verwenden, was Sie bereits wissen: die Befehlszeile.
Das ist wirklich die Kraft des Skripts, denke ich. Sie können mit Befehlen programmieren, die Sie bereits kennen, während Sie die wichtigsten Programmiersprachen lernen. Müssen Sie etwas Wiederholendes und Langweiliges tun? Skript es! Benötigen Sie eine Verknüpfung für einen wirklich verschlungenen Befehl? Skript es! Möchten Sie eine wirklich benutzerfreundliche Befehlszeilenschnittstelle für etwas erstellen? Skript es!
Bevor Sie beginnen
Bevor wir mit unserer Skriptserie beginnen, wollen wir einige grundlegende Informationen behandeln. Wir werden die Bash-Shell verwenden, 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 in der Lage sein, unabhängig von Ihrer Plattform Skripte zu erstellen. Solange alle Befehle vorhanden sind, auf die verwiesen wird, können Skripte auf mehreren Plattformen ausgeführt werden, ohne dass Anpassungen erforderlich sind.
Bei Skripten können problemlos Administrator- oder Superuser-Berechtigungen verwendet werden. Testen Sie daher Skripte am besten, bevor Sie sie in Betrieb nehmen. Verwenden Sie auch den gesunden Menschenverstand, z. B. um sicherzustellen, dass Sie Backups 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 Befehl rm zu verwenden, damit Ihre Interaktion erforderlich ist. Dies kann einige böse Fehler verhindern. Lesen Sie daher die heruntergeladenen Skripte durch und gehen Sie vorsichtig mit Ihren Daten um, falls etwas schief gehen sollte.
Skripte sind im Kern nur reine Textdateien. Sie können jeden Texteditor verwenden, um sie zu schreiben: gedit, emacs, vim, nano … Diese Liste geht weiter. Speichern Sie es nur als einfachen Text, nicht als Rich Text oder als Word-Dokument. Da ich die Benutzerfreundlichkeit von Nano liebe, werde ich das nutzen.
Skriptberechtigungen und -namen
Skripte werden wie Programme ausgeführt, und damit dies geschieht, müssen sie über die richtigen Berechtigungen verfügen. Sie können Skripte ausführbar machen, indem Sie den folgenden Befehl ausführen:
chmod + x ~ / somecrazyfolder / script1
Auf diese Weise kann jeder dieses bestimmte Skript ausführen. Wenn Sie die Verwendung nur auf Ihren Benutzer beschränken möchten, können Sie stattdessen Folgendes verwenden:
chmod u + x ~ / somecrazyfolder / script1
Um dieses Skript auszuführen, müssten Sie in das richtige Verzeichnis cd und dann das Skript wie folgt ausführen:
cd ~ / somecrazyfolder
./script1
Um die Arbeit zu vereinfachen, können Sie Skripte in einem Ordner «bin» in Ihrem Home-Verzeichnis ablegen:
~ / bin
In vielen modernen Distributionen wird dieser Ordner nicht mehr standardmäßig erstellt, sondern Sie können ihn erstellen. Hier werden normalerweise ausführbare Dateien gespeichert, die Ihrem Benutzer und nicht anderen Benutzern gehören. Wenn Sie hier Skripte platzieren, können Sie sie einfach ausführen, indem Sie wie bei anderen Befehlen ihren Namen eingeben, anstatt herumzudrehen und das Präfix ‘./’ zu verwenden.
Bevor Sie jedoch ein Skript benennen, sollten Sie den folgenden Befehl ausführen, um zu überprüfen, ob ein Programm installiert ist, das diesen Namen verwendet:
welche [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 in Konflikt steht, der ohne Argumente nichts tut. Stellen Sie immer sicher, dass Ihre Skriptnamen nicht mit Befehlen in Konflikt stehen, da Sie sonst möglicherweise Dinge tun, die Sie nicht beabsichtigen!
Skriptrichtlinien
Wie ich bereits erwähnt habe, besteht jede Skriptdatei im Wesentlichen aus einfachem Text. Das heißt aber nicht, dass Sie wohl oder übel schreiben können, was Sie wollen. Wenn versucht wird, eine Textdatei auszuführen, werden sie von Shells analysiert, um Hinweise darauf zu erhalten, ob es sich um Skripte handelt oder nicht und wie alles richtig gehandhabt wird. Aus diesem Grund gibt es einige Richtlinien, die Sie kennen müssen.
- Jedes Skript sollte mit «#! / Bin / bash» versehen sein.
- Jede neue Zeile ist ein neuer Befehl
- Kommentarzeilen beginnen mit einem #
- Befehle sind umgeben von ()
Der Hash-Bang Hack
Wenn eine Shell eine Textdatei analysiert, können Sie die Datei am direktesten als Skript identifizieren, indem Sie die erste Zeile eingeben:
#! / 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, nachdem dies eine Art Hack ist, der diese Kommentarregel umgeht und das Skript zwingt, mit der Shell auszuführen, auf die diese Zeile zeigt.
Neue Zeile = Neuer Befehl
Jede neue Zeile sollte als neuer Befehl oder als Komponente eines größeren Systems betrachtet werden. If / then / else-Anweisungen übernehmen beispielsweise mehrere Zeilen, aber jede Komponente dieses Systems befindet sich in einer neuen Zeile. Lassen Sie einen Befehl nicht in die nächste Zeile übergehen, da dies den vorherigen Befehl abschneiden und in der nächsten Zeile einen Fehler anzeigen kann. Wenn Ihr Texteditor dies tut, sollten Sie den Textumbruch aus Sicherheitsgründen deaktivieren. Sie können das Umbrechen von Text in Nano-Bit deaktivieren, indem Sie ALT + L drücken.
Kommentar Oft mit #s
Wenn Sie eine Zeile mit einem # beginnen, wird die Zeile ignoriert. Dies verwandelt es in eine 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 erneut den Textumbruch oder teilen Sie Ihren Kommentar in mehrere Zeilen auf, die alle mit einem Hash beginnen. Die Verwendung vieler Kommentare ist eine gute Vorgehensweise, da Sie und andere Personen Ihre Skripte einfacher optimieren können. Die einzige Ausnahme ist der oben erwähnte Hash-Bang-Hack. Folgen Sie also nicht #s mit! S. ;-);
Befehle sind von Klammern umgeben
In früheren Tagen 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 losziehen und es erkunden, 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 Befehle in andere Befehle einfügen.
Dein erstes Skript
Beginnen wir mit einem einfachen Skript, mit dem Sie Dateien kopieren und Datumsangaben an das 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:
Sie können sehen, dass der Befehl which nicht ausgegeben wird. Daher sind wir alle bereit, diesen Namen zu verwenden.
Erstellen wir eine leere Datei im Ordner ~ / bin:
Berühren Sie ~ / bin / datecp
Und ändern wir jetzt die Erlaubnis, bevor wir vergessen:
Beginnen wir dann mit der Erstellung unseres Skripts. Öffnen Sie diese Datei in einem Texteditor Ihrer Wahl. Wie gesagt, ich mag die Einfachheit von Nano.
nano ~ / bin / datecp
Lassen Sie uns fortfahren und die erste Zeile und einen Kommentar dazu einfügen, was dieses Skript bewirkt.
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 «erweitert» werden, wenn auf sie an anderer Stelle verwiesen wird. Das heißt, anstatt ihren Namen anzuzeigen, zeigen sie ihren gespeicherten Inhalt an. Sie können dieselbe Variable später anweisen, unterschiedliche Informationen zu speichern, und jede Anweisung, die danach erfolgt, verwendet die neuen Informationen. Es ist ein wirklich ausgefallener Platzhalter.
Was werden wir in Variable ausgeben? Speichern wir Datum und Uhrzeit! Dazu rufen wir den Datumsbefehl auf.
Schauen Sie sich den Screenshot unten an, um zu erfahren, wie Sie die Ausgabe des Datumsbefehls erstellen:
Sie können sehen, dass Sie durch Hinzufügen verschiedener Variablen, die mit% beginnen, die Ausgabe des Befehls nach Ihren Wünschen ändern können. Weitere Informationen finden Sie auf der Handbuchseite für den Datumsbefehl.
Verwenden wir die letzte Iteration des Datumsbefehls «Datum +% m_% d_% y-% H.% M.% S» und verwenden Sie diese in unserem Skript.
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 hierfü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 Befehlssubstitution. Wir sagen bash im Wesentlichen, dass der Befehl immer dann, wenn die Variable «date_formatted» angezeigt wird, in den Klammern ausgeführt werden soll. Dann sollte die Ausgabe der Befehle anstelle des Namens der Variablen «date_formatted» angezeigt werden.
Hier ist ein Beispielskript und seine Ausgabe:
Beachten Sie, dass die Ausgabe zwei Leerzeichen enthält. Das Leerzeichen in den Anführungszeichen des Echo-Befehls und das Leerzeichen vor der Variablen werden beide angezeigt. Verwenden Sie keine Leerzeichen, wenn Sie nicht möchten, dass sie angezeigt werden. Beachten Sie auch, dass das Skript ohne diese zusätzliche Echozeile absolut keine Ausgabe liefern würde.
Kehren wir zu unserem Skript zurück. Fügen wir als nächstes den Kopierteil des Befehls hinzu.
cp –iv $ 1 $ 2. $ date_formatted
Dadurch wird der Kopierbefehl mit den Optionen –i und –v aufgerufen. Ersteres fordert Sie zur Überprüfung auf, bevor Sie eine Datei überschreiben, und letzteres zeigt an, was sich in der Befehlszeile befindet.
Als nächstes können Sie sehen, dass ich die Option «$ 1» hinzugefügt habe. Bei der Skripterstellung kennzeichnet 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 «ringtone.mp3».
Wenn wir auf unser Skript zurückblicken, sehen wir, dass wir auf zwei Argumente verweisen:
Dies bedeutet, dass wir beim Ausführen des Skripts zwei Argumente angeben müssen, damit das Skript ordnungsgemäß 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. Sie können aber auch sehen, dass es anders ist. Wir haben einen Punkt hinzugefügt und von oben auf die Variable «date_formatted» verwiesen. Neugierig, was das macht?
Folgendes passiert, wenn das Skript ausgeführt wird:
Sie können sehen, dass die Ausgabedatei als das aufgeführt ist, was ich für $ 2 eingegeben habe, gefolgt von einem Punkt und 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 Datum und Uhrzeit automatisch zum Ende des Dateinamens hinzufügen. Nützlich für die Archivierung!
Shell-Scripting ist das Herzstück dafür, dass Ihr Betriebssystem für Sie funktioniert. Sie müssen auch keine neue Programmiersprache lernen, um dies zu erreichen. Versuchen Sie, zu Hause Skripte mit einigen grundlegenden Befehlen zu erstellen, und überlegen Sie, wofür Sie diese verwenden können.
Schreiben Sie? Haben Sie Ratschläge für Neulinge? Teilen Sie Ihre Gedanken in den Kommentaren! Es gibt noch mehr in dieser Serie!