Shellscript

Ein Shellscript ist ein wenig der Batchdatei in Windows ähnlich. Ein Shellscript arbeitet im Normalfall im Terminal. Da die Bash, das ist möglicherweise die meistgenutzte Shell unter Linux, aber allmächtig ist, hinkt der Vergleich mit der Batchdatei von Windows. Denn auch die sogenannte „PowerShell“ von Windows hat nicht annähernd die Kraft einer Bash.

Inhaltsverzeichnis

Was bringt ein Shellscript

Stellen Sie sich vor, sie haben wöchentlich wiederkehrende Arbeiten zu erledigen, die immer nach einen Muster abgearbeitet werden. Oder Sie wollen auch in großen und unregelmäßigen Zeitabständen, sehr komplexe Kommandos nutzen, sind aber zu faul, jedes mal die sehr lange Zeichenkette einzugeben. Da kommt das Shellscript ins Spiel.

Hier eine kleine Motivation für Debian basierende Systeme. Sie wollen Ihr System wie folgt aktualisieren, reparieren und bereinigen.

  1. Einlesen der Paketlisten # apt update
  2. Neue Pakete sollen ältere Versionen ersetzen, auch notwendige Abhängigkeiten # apt upgrade
  3. Es soll auf ein Distributions-Upgrade geprüft werden # apt dist-upgrade
  4. Wenn notwendig, Konfiguration des Paketverwalters bei fehlerhaften Paketen # dpkg –configure -a
  5. Wenn notwendig, den Paketverwalter selbst reparieren # apt install -f
  6. Paketcaches leeren, also ungenutzte Installationsdateien # apt clean
  7. Verwaiste Abhängigkeiten mit Ihren Paketen löschen # apt autoremove
  8. Anzeige ob die Befehle fehlerfrei abgearbeitet wurden
  9. Oder wo Fehler entstanden sind

Alle diese Kommandos können in wenigen Sekunden durch ein Script erledigt werden. Jetzt können Sie über Fernwartung Ihrem Freund oder Ihrer Mutter schnell ein aktuelles und sauberes debian-basierendes System erstellen.

Aber unser interessantes Beispiel-Script wird wesentlich einfacher sein, versprochen.

Zusammengefasst

  • Eigene Shellscripte vereinfachen Alltagsarbeiten
  • Eigene Shellscripte sparen eine Menge an Zeit
  • Eigene Shellscripte könne Werkzeuge sein, die anderen Menschen helfen

Grundlagen

Im Allgemeinen spricht man von einem Shell-Script. Da unter vielen Distributionen die Bash-Shell, die meist genutzte Shell ist, werden wir uns auf diese konzentrieren.

Um gleich die Angst zu nehmen, das Bash-Script ist eine einfache Textdatei, fertig aus.

Der Unterschied zu anderen Textdateien, ist die erste Zeile in dieser Datei und Sie sollten wissen, was ein Linuxbefehl, auch Kommando, ist.

Außerdem sollten Sie wissen, wo Sie sich im Verzeichnisbaum befinden, damit Sie die Ausgabe Ihres Shellscripts auch finden.

Shellscripts haben die Dateiextension „.sh“, aber ohne diese Dateinamenserweiterung geht es auch, ist aber für die Übersichtlichkeit nicht zu empfehlen.

Zusammengefasst

  1. Wir erstellen ein Shellscript für die Bash
  2. Das Shellscript ist eine Textdatei mit einer vordefinierten ersten Zeile
  3. In einer Shellscript werden Linuxbefehle abgearbeitet
  4. Die Dateiendung eines Shellscripts ist „.sh“

Vorbereitungen

Dateiname

Bewährt hat sich bei mir die Einschränkung auf folgende Zeichen:

  • Ziffern 0 bis 9
  • Alle Buchstaben von A bis z
  • Als Sonderzeichen nur den Unterstrich, selten noch den Bindestrich

Ansonsten sind Sonderzeichen zu vermeiden, da einigen schon Funktionen zugeordnet sind.

Der Dateiname sollte unbedingt aussagekräftig sein. Denn wenn eines Tages 50 Scripte vorliegen, nützen abgekürzte Namen wie „pa_ne.sh“ für „paketliste_neu.sh“ nichts mehr.

Zuerst muss mit „which“ oder „type“ geprüft werden, ob der vorgesehen Dateiname des Script nicht schon vergeben ist. Achtung, die Abfrage ohne Dateiextension.

which paketliste_neu

Sollte die Ausgabe so aussehen „which: no …“, dann gibt es kein Kommando mit gleichem Name.

which: no paketliste_neu in (/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/bin/site_perl:/usr/bin/vendor_perl:/usr/bin/core_perl)

Hier mit „type“.

type paketliste_neu
bash: type: paketliste_neu: Nicht gefunden.

Layout eines Script

Auch wenn hier es sich hier nur ein sehr kleines Script handelt, das auch als „alias“ genutzt werden könnte, zeige ich noch einige Elemente.

Einzeilige Kommentare beginnen mit einer Raute und höflicherweise einen anschließendem Leerzeichen. Generell werden Kommentare bei der Ausführung des Scripts nicht angezeigt.

# 

Mehrzeilige Kommentare beginnen mit Doppelpunkt zwei nach links zeigenden spitzen Klammern und ein einleitendes Kommentarwort.

: <<Kommentar

Für auszugebenden Text wurde früher „echo“ genommen. Da aber einige Distributionen daran etwas rumbasteln, empfehle ich „printf“. In den Anführungszeichen steht der auszugebende Text.

printf "Textinhalt"

Zeilenumbruch entweder mit Backslash \ oder Backslash mit n wie \ n darstellen, letztere ist meine Empfehlung.

printf "Ein sehr langer Text\nwurde eben umgebrochen."

Unser Beispiel

In unserem Beispiel beziehen wir uns auf die Debian-Kommandos, die auch für „Ubuntu“, „Linux Mint“ und weitere Debian-Derivate gelten.

Es wäre ja interessant zu wissen, welche Pakete in unserem laufenden GNU/Linux vorhanden sind. Einmal um Programme zu finden, die nicht mehr genutzt werden und im grafischen „Softwaremanager“ leider nicht angezeigt werden. Und es könnte für eine Wiederherstellung des bestehenden Systems, ein Backup der Paketliste erstellt werden.

Das war das Stichwort „Paketliste“. Wir erstellen mit Hilfe eines einfachen Scripts eine Paketliste aller installierten Pakete in Form einer Textdatei mit Spaltenansicht.

Zudem bekommt jede Datei das aktuelle Datum mit in den Dateinamen geschrieben, so können Sie schnell Vergleiche anstellen.

Und das Sahnehäubchen, alle Pakete werden mit Angabe der Version und einer Beschreibung Ihrer Funktion ausgeliefert!

Zusammengefasst

  • Unser Shellscript erstellt eine Liste aller installierten Pakete
  • Die Liste ist eine txt-Datei, auch Plaintext-Datei
  • Im Dateinamen ist das aktuelle Datum gleich mit angegeben
  • In der Paketliste wird jedem Paket die Versionsnummer, eine Kurzbeschreibung und andere Informationen mitgegeben

Das Shellscript

Bitte legen Sie eine Textdatei mit dem Namen „paketliste_neu.sh“ an und füllen Sie mit dem folgenden Inhalt. Zum Abschluss bitte diese Datei abspeichern.

#!/bin/bash

# Scriptname : backup-paketliste
# Description: Safe the packages_list with few informations
# Author     : Frank Rosenberger <https://ro-kom.de>
# Date       : 2018-11-31
# Version    : 0.3
# License    : GPL3

COLUMNS=200 dpkg-query -l > ~/paketliste_`date +%Y%m%d`.txt
exit [n]

: <<Kommentar
Für deutsche Benutzer
Dieses Script listet alle installierten Pakete mit Name, Version, Architektur und Beschreibung auf und speichert diese in eine Datei mit aktuellem Datum im Dateinamen und Dateierweiterung für Plaintext in "/home/BENUTZER/".
Beachte, vor date und nach day ist KEIN Apostroph, sondern jeweils ein Gravis.
Kommentar

Der einleitende Script-Header und die Kommentare sind nicht verpflichtend. Aber gerade Kommentare erleichtern das Verstehen von sehr komplexen Script erheblich und ein nachfolgender Nutzer oder Betreuer ist dafür dankbar.

Das Shellscript im Einzelnen

Nun die Zeilen detailliert beschrieben.

Zeile 1. Das ist die interpretierende Shell. In unserem Fall die Bash, also die Bourne-Again-Shell. Diese Zeile wird auch „She-bang“ genannt. Hier hat die Raute keine Kommentarfunktion. Außerdem dürfen keine weitere Zeichen angegeben werden. Nur Argumente haben noch eine Berechtigung in dieser Zeile.

1. #!/bin/bash

Zeile 2, ist eine Leerzeile zur Übersicht.

2. 

Zeile 3, ist ein Kommentar, angezeigt durch die Raute. Ein aussagekräftiger Name für das Script.

3. # Scriptname : backup-paketliste

Zeile 4, ist ein Kom­men­tar. Eine Be­schrei­bung er­leich­tert kom­ple­xe­re Scrip­te in ih­ren Funk­tio­nen zu ver­ste­hen.

4. # Description : Safe the packages_list with few informations

Zeile 5, Der Kommentar zeigt den Autor an, um gegebenenfalls eine hilfreiche Rückmeldung zu seinem Script zu geben.

5. # Author : Frank Rosenberger <https://ro-kom.de>

Zeile 6 ist ein Kommentar. Angabe des Datum der Script-Veröffentlichung.

6. # Date : 2018-11-31

Zeile 7 ist ein Kommentar. Eine Versionsnummer hilft die Fehlerbehebung oder Entwicklung nachzuvollziehen

7. # Version : 0.3

Zeile 8 ist ein Kommentar. Angabe der Lizenz unter der man dieses Script veröffentlicht.

8. # License : GPL3

Zeile 9 ist eine Leerzeile um den Kopf zu beenden.

9. 

Zeile 10, jetzt kommen die Kommandos, also das Herzstück des Shellscript. Nachfolgend aufgeschlüsselt.

  • COLUMNS=200 Hier wird die Spaltenanzahl angegeben. In unserem Fall dürfen 200 Zeichen auf einer Zeile stehen.
  • dpkg-query -l Hier eine Abfrage des Paketverwalters „dpkg“ nach den installierten Paketen. Das Argument „-l“ steht hier als Wildcard, auch „Joker“, für alle Pakete.
  • > Diese Spitze Klammer soll einen „Druck“ der Abfrage erstellen. Druck im Sinne von „Erstelle eine Datei“.
  • ~/ Die Tilde und der Frontslash geben den Pfad an, wo diese Datei abgelegt werden soll. In unserem Fall, durch de Tilde gekennzeichnet, direkt in das Heimatverzeichnis, in dem auch die Verzeichnisse „Bilder“, „Dokumente“ und so weiter, liegen.
  • paketliste_date +%Y%m%d.txt Das ist der Dateiname mit dem Datum im Dateiname und als Textdatei.
COLUMNS=200 dpkg-query -l > ~/paketliste_date +%Y%m%d.txt

Zeile 11, das Script soll nun beendet werden. Das kleine „n“ in den eckigen Klammern ist für die Ausgabe einer Ziffer. Die Ziffer ist optional für eine Fehlerausgabe.

exit [n]

Zeile 12 ist eine Leerzeile um die Kommandos vom abschließenden Kommentar zu trennen.

12. 

Zeile 13 bis vorletzte Zeile, das ist ein mehrzeiliger Kommentar, angezeigt durch den Doppelpunkt und den zwei spitzen Klammern die nach links zeigen und einem Wort, hier ist es „Kommentar“.

: <<Kommentar
Für deutsche Benutzer
Dieses Script listet alle installierten Pakete mit Name, Version, Architektur und Beschreibung auf und speichert diese in eine Datei mit aktuellem Datum im Dateinamen und Dateierweiterung für Plaintext in "/home/BENUTZER/".Beachte, vor date und nach day ist KEIN Apostroph, sondern jeweils ein Gravis.
Kommentar

Die letzte Zeile beendet den mehrzeiligen Kommentar mit der Wiederholung des Wortes nach den spitzen Klammern.

Kommentar 

Zusammengefasst

  1. Jedes Shellscript beginnt mit Angabe des Interpreters
  2. Ein Kopf mit den Angaben des Autors, Lizenz, Datum, Scriptname,Version und Beschreibung ist hilfreich für die Nutzung und Weiterentwicklung des Script
  3. Das Kernstück des Scripts sind Kommandos
  4. Einzeilige Kommentare werden mit einer Raute gekennzeichnet
  5. Kommentare erleichtern das Verständnis für komplexere Scripte

Das Shellscript starten

Das Script mit dem Recht „Ausführbar“

Bevor ein Shellscript startet wird es mit folgendem Kommando ausführbar gesetzt oder mit der oktalen Schreibweise.

chmod u+x paketliste_neu.sh
chmod 0744 paketliste_neu.sh

Pfad zum Script

Da­mit al­les so funk­tio­niert, wie hier an­ge­ge­ben, muss die Da­tei di­rekt in das /home-Ver­zeich­nis des je­wei­li­gen Be­nut­zers, hier “user”.

/home/user/paketliste_neu.sh

Später, wenn schon viele Scripts erstellt wurden, sollte diese in ein Verzeichnis, die in der Umgebungsvariable PATH schon eingetragen sind oder man setzt ein neues Verzeichnis dazu, wie nachfolgendes Verzeichnis.

/home/user/bin

Terminaleingabe

Um ein Shellscript zu starten wird „sh“, beziehungsweise „bash“, und ein Leerzeichen benötigt, vor dem Pfad und dem Script-Dateiname. Also wie folgt vorgehen.

  1. Öffnen Sie ein Terminalfenster dort wo das Shellscript abgelegt ist, bei komplexen Scripten bitte die Konsole statt dem Terminalfenster nutzen
  2. Geben Sie ein „sh ~/paketliste_neu.sh“ und bestätigen Sie mit der „Enter“-Taste, fertig
  3. Nun in das Heimatverzeichnis gehen und die Paketliste öffnen

Wenn eine sehr lange Liste in der Datei zu sehen ist, haben Sie Ihr erstes Script realisiert, Glückwunsch.

Shellscript mit Doppelklick starten

Windows-Umsteigern wollen einen Doppelklick. Auch diese „Erleichterung“ ist möglich. Dazu muss man wissen, unter Linux ist alles eine Datei, egal ob ein Gerät, wie die Festplatte oder ein Doppelklick zum starten eines Shellscript. Deswegen erstellen wir jetzt die Doppelklickdatei, oder besser die „NeuePaketliste.desktop“-Datei. Auch diese Datei ist eine reine Textdatei, aber mit der Dateinamenserweiterung“.desktop“ statt „.txt“.

Doppelklickdatei erstellen

Also eine Doppelklickdatei gibt es nicht in den einschlägigen Lexika, es ist eine Wortschöpfung um den Vorgang zu visualisieren. Es entspricht in Windows der Datei-Verknüpfung. Bitte auf dem Schreibtisch eine Textdatei anlegen und diese mit „NeuePaketliste.desktop“ benennen. Öffnen Sie die Datei mit Ihrem Texteditor, also Gedit oder Mousepad, und geben folgenden Inhalt ein.

[Desktop Entry] 
Version=1.0 
Name=paketliste_neu.sh 
Comment=this script safe the packages_list with few informations 
GenericName=NeuePaketliste 
Exec=sh
Terminal=true
Type=Application
Icon=preferences-system-windows
StartupNotify=true
Path=~/

Nun kann eine neue Datei der Paketliste vom Schreibtisch/Desktop aus mit einem Doppelklick erstellt werden, die wiederum im Heimatverzeichnis zu finden ist.

Ihr Kommentar | Ihre Spende[Pos1] Seitenanfang