Im einfachsten Fall enthält ein Bash-Script nur eine Zeile, die ein anderes Programm startet. Bash-Scripts sind aber besonders nützlich, wenn mehrere Aufgaben nacheinander ausgeführt werden sollen. Der Bash-Interpreter bietet eine Script-Sprache mit fast allem, was man von einer Programmiersprache erwarten kann. Dieser Artikel liefert zu Beginn eine minimale Einführung, danach folgen praktische Beispiele. Wer mehr zur Bash-Programmierung erfahren möchte, dem sei das Buch „Shell-Programmierung“ empfohlen, das Sie kostenlos unter https://openbook.rheinwerk-verlag.de/shell_programmierung/ lesen können. Die gedruckte Version des Buches ist für 44,90 Euro erhältlich (https://m6u.de/SHPROG).
Service: Kommandozeilen und Scripts aus diesem Artikel finden Sie online über
https://m6u.de/BASHS.
Die Bash-Basics
Bash-Scripts und Shell-Scripts allgemein sind einfache Textdateien, die Sie mit jedem Editor wie Gnome-text-editor (Ubuntu 24.04), Gedit (Ubuntu 22.04 und älter) oder Xed (Linux Mint) erstellen und bearbeiten. Im Terminal verwenden Sie Nano oder Mcedit (enthalten im Paket „mc“). Die Dateinamenserweiterung spielt an sich keine Rolle. Um die Funktion zu verdeutlichen, sind aber Endungen wie „.sh“ oder „.bash“ gebräuchlich.
Es ist nicht zwingend erforderlich, aber guter Stil, in ein Bash-Script als erste Zeile
#!/usr/bin/env bash
einzubauen. Damit ist sichergestellt, dass beim direkten Start der Bash-Interpreter zum Einsatz kommt, selbst wenn ein Linux-System als Standard eine andere Shell nutzt.
Scripts starten: Ein Bash-Script kann direkt gestartet werden, wenn die Datei ausführbar ist, was Sie mit
chmod +x [Dateiname]
erreichen. Im Terminal wechseln Sie mit cd in den Ordner des Scripts und starten es mit
./[Dateiname]
oder Sie verwenden in einem beliebigen Ordner den kompletten Pfad:
~/[Ordner]/[Dateiname]
Wenn das Script nicht – wie oben mit chmod – ausführbar ist, kann ein Start mit
bash [Dateiname]
trotzdem erfolgen.
Damit sich ein Script ohne Verzeichniswechsel von überall aus starten lässt, kopieren Sie es am besten in den Ordner „bin“ in Ihrem Home-Verzeichnis. Sofern der Ordner bisher nicht vorhanden ist, erstellen Sie ihn neu und geben dann
source ~/.profile
ein. Damit nehmen Sie den Ordner „~/bin“ in den Pfad auf, was aber nur für das aktuelle Terminal gilt. Nach einem Linux-Neustart oder beim erneuten Anmelden gilt der Pfad permanent in allen Terminals.
Script mit Dateimanager starten: Während der Script-Entwicklung sollte man nur im Terminal arbeiten. Was beim Doppelklick im Dateimanager passiert, hängt von der Distribution ab. Ubuntu öffnet ein ausführbares Script im Texteditor, nur der Kontextmenüpunkt „Als Anwendung ausführen“ startet es. Wenn ein Script nicht stoppt, weil es auf Benutzereingaben wartet, öffnet sich nur kurz ein Terminal und Sie erhalten keine Rückmeldung. Linux Mint zeigt ein Fenster, in dem Sie auf „Anzeigen“ (im Editor öffnen), „Im Terminal ausführen“ oder „Ausführen“ klicken. Bei „Ausführen“ startet das Script unsichtbar im Hintergrund.

Externe und interne Befehle: Ein Bash-Script kann als einfacher Stapelprozessor dienen und Programme der Reihe nach starten. Das ist vor allem für Kommandozeilentools nützlich, wenn das von einem Tool erzeugte Resultat gleich von einem anderen weiterverarbeitet werden soll. Auch bei einem einzelnen Tool ist der Start per Script sinnvoll, wenn immer die gleiche Aufgabe erledigt werden soll und dafür diverse Aufrufschalter nötig sind.
Bash stellt einige interne Kommandos bereit, die die eigentliche Script-Sprache bilden. Eine Übersicht liefert der Befehl „help“ im Terminal. Der Aufruf beispielsweise von
help cd
zeigt die Hilfe zu einem Kommando.
Variablen: Variablen können Rückgabewerte oder Konfigurationsdaten enthalten. Die Zuweisung erfolgt mit
VARIABLE="Wert“
Wenn in „Wert“ keine Leerzeichen enthalten sind, können die Anführungszeichen auch entfallen. Im Script wird dann auf die Variable mit einem vorangestellten „$“ zugegriffen. Die Zeile
echo $VARIABLE
gibt den Wert im Terminal aus. Groß- und Kleinschreibung wird bei den Bezeichnungen unterschieden. Achten Sie in Scripts außerdem auf korrekt gesetzte Leerzeichen, etwa bei einer Konstruktion wie
if [ -n "$1" ]; then
echo $1
else
echo "Keine Option angegeben"
fi
Die Standardvariable „$1“ enthält den ersten Parameter, der dem Script übergeben wird. „if“ prüft mit „-n“, ob diese Variable einen Wert enthält. Wenn ja, wird er mit „echo“ ausgegeben, andernfalls informiert eine Meldung über die nicht vorhandene Option. Die Leerzeichen nach „[“ und vor „]“ müssen sein, sonst bricht Bash die Script-Ausführung mit einer Fehlermeldung ab.
Backups mit Rsync erstellen
Im Beitrag „Autostarts und Cronjobs“ haben wir ab Seite 44 ein kleines Backup-Script vorgestellt, das einen Ordner mit Tar komprimiert und in einem Sicherungsverzeichnis ablegt. Dieses Script erstellt immer ein komplettes Backup aller Dateien, jeweils in einem neuen Tar-Archiv. Diese Methode ist für Ordner mit wenigen Dateien ausreichend. Bei umfangreichen Ordnern dauert das Backup zu lange, und es sammeln sich mit der Zeit viele große und redundante Archivdateien an.
Für regelmäßige Sicherung von Ordnern mit vielen Dateien sollte man daher besser Rsync verwenden. Das Tool erstellt gespiegelte Dateistrukturen. Bevor Sie Rsync in einem Script verwenden, probieren Sie es zuerst im Terminal aus. Der Befehl kann dabei so aussehen:
rsync -auP /home/sepp /media/sepp/usb/backup
Das erste nach den Schalteroptionen angegebene Verzeichnis ist der Quellordner, das zweite das Backupziel. In dem Beispiel gehen wir davon aus, dass ein USB-Laufwerk mit dem Label „usb“ unter „/media/sepp“ eingehängt ist. Das angegebene Verzeichnis („backup“) wird automatisch erstellt, falls es bei der allerersten Sicherung noch nicht existiert. Das Backup liegt danach im Ordner „/media/sepp/usb/backup/sepp“. Rsync erstellt mit den angegebenen Schaltern eine inkrementelle Sicherung – nur neue oder geänderte Dateien werden beim nächsten Aufruf kopiert.
Wichtiger Hinweis: Das Backuplaufwerk muss mit einem Linux-Dateisystem wie Ext4 formatiert sein. Sonst kann Rsync (jedenfalls mit Schalter „-a“) keine Zugriffsrechte, Softlinks oder Hardlinks speichern. Das gilt für Rsync generell, also auch für die nachfolgenden Scripts in diesem Beitrag.

Backup-Script erstellen: Die bisher vorgestellte Verwendung von Rsync lässt Wünsche offen. Man kann zum Beispiel nicht auf den ersten Blick erkennen, was sich gegenüber einem vorherigen Backup geändert hat. Eine Verbesserung bietet das Script mit dem Namen „backup.bash“:
#!/usr/bin/env bash
date='date "+%Y-%m-%dT%H_%M_%S"'
SOURCEDIR=$HOME/Dokumente
BACKUPDIR=/media/$USER/usb/backup
rsync -avP --log-file=$HOME/rsync.log --link-dest=$BACKUPDIR/current $SOURCEDIR $BACKUPDIR/back-$date
ln -nsf back-$date
$BACKUPDIR/current
Es sichert den Ordner „Dokumente“ des aufrufenden Benutzers („$HOME“) in den Ordner „/media/$USER/usb/backup“. „$USER“ ersetzt das Script durch den Benutzernamen. Jeder Backupordner trägt als Bezeichnung das aktuelle Datum und die Uhrzeit. Anschließend erzeugt das Script mit „ln -s“ einen symbolischen Link mit dem Namen „current“ auf das eben erstellte Backupverzeichnis. Es dient beim nächsten Aufruf als Quelle für Hardlinks im neuen Backupordner. Die Hardlinks verweisen auf die Dateien aus dem zuerst erstellten Backupordner, benötigen aber selbst keinen Speicherplatz. Nach einiger Zeit können Sie die ältesten Backupordner löschen. Nur der zuletzt erstellte Ordner muss immer erhalten bleiben.
Sie können bei Bedarf die Inhalte der Backupordner untereinander oder mit der Quelle vergleichen, etwa mit
diff --brief --recursive $HOME/Dokumente /media/$USER/usb/backup/[Backup-Ordner]/Dokumente
„Diff“ zeigt an, welche Dateien nur in dem einen oder dem anderen Ordner vorhanden sind.
Backup zurücksichern: Dateien aus einem Rsync-Backup lassen sich einfach wiederherstellen, indem Sie die gewünschten Dateien oder Ordner zurück in Ihr Home-Verzeichnis kopieren.

Backup-Script mit mehr Funktionen
Das Script „backup.bash“ genügt für ein Backup der persönlichen Daten, meist werden Sie aber noch weitere Verzeichnisse sichern wollen. Wünschenswert ist außerdem eine Backupstruktur, die in Tagen, Wochen und Monaten übersichtlich organisiert ist. Das erweiterte Script „backup_ex.bash“ (https://m6u.de/BASHS) ist für die Sicherung ausgewählter Ordner gedacht. Die Befehlszeile
sudo ./backup_ex.bash -s "/" -t
"/Backup" -n "local-data"
würde das komplette System („/“) unter
„/Backup“ im Ordner „lokal-data“ sichern. Die Option „-h“ zeigt eine Liste der möglichen Optionen. Eine Komplettsicherung dauert allerdings lange und ist für die meisten Nutzer unnötig. Deshalb berücksichtigt das Script eine Konfigurationsdatei mit der Backupbezeichnung, in unserem Beispiel „local-data.include“. Sie enthält Beispieldefinitionen für Ordner, die in das Backup aufgenommen oder ausgeschlossen werden sollen. „+ /etc/“ schließt den Ordner
„/etc“ ein und „- .cache“ klammert Ordner mit dieser Bezeichnung aus. Soll nur ein bestimmtes Unterverzeichnis gesichert werden, muss zuerst der darüberliegende Ordner eingeschlossen werden (Beispiel):
+ /var/
+ /var/www/
- /var/*
Rsync sichert dann die Dateien des Webservers („/var/www“), berücksichtigt durch
„- /var/*“ jedoch keine weiteren Ordner unterhalb von „/var“. Die letzte Zeile „- /*“ schließt alle Ordner und Dateien aus, außer den zuvor angegebenen.
Konfigurieren Sie einen Systemd-Dienst oder einen Cronjob für den täglichen Start des Scripts (siehe ab Seite 44). Im Zielordner entstehen unter „Daily“ Ordner für jeden Wochentag, am Freitag unter „Weekly“ ein Ordner für die aktuelle Woche, und am Ersten des Monats erfolgt ein Backup in den Ordner „Monthly“. Alle doppelten Dateien sind platzsparende Hardlinks zum vorherigen Backup.
Bilder per Script konvertieren
Für eine automatisierte Bildkonvertierung eignet sich das Tool Convert aus dem Paket Imagemagick, das Sie unter Ubuntu und Linux Mint mit
sudo apt install imagemagick-6.q16
installieren. Mit
convert Bild.png Bild.jpg
lässt sich eine Bilddatei ganz einfach in ein anderes Format umwandeln. Die Angabe der Dateiendung genügt. Für eine proportionale Größenänderung verwendet man
convert Bild.jpg -resize 50% Bild-klein.jpg
Wenn Sie mehrere Bilder konvertieren wollen, benötigen Sie ein Bash-Script wie „convert_images.bash“. Es ermittelt die Dateinamen in einer Schleife und übergibt diese an convert. Passen Sie die Pfade hinter „IN=“ und „OUT=“ für Ihr System an:
#!/usr/bin/env bash
IN=~/Bilder/Urlaub
OUT=~/Bilder/Urlaub/klein
for f in $IN/*.jpg do
echo "Verarbeite $f"
filename=$(basename -- "$f")
filename="${filename%.*}"
/usr/bin/convert -resize 50%
$f $OUT/$filename.jpg
done
Das Script zeigt, dass sich in neun Zeilen eine ganze Menge erledigen lässt.
Diashow aus Bilddateien erstellen
Videos sind eine Abfolge von Einzelbildern, weshalb sich ähnlich einem Daumenkino aus einzelnen Bildern ein Video erstellen lässt. Dafür benötigen Sie Ffmpeg, das Sie bei Bedarf so nachinstallieren:
sudo apt install ffmpeg
Die Bilddateien müssen fortlaufend nummeriert sein, etwa als „img001.jpg“, „img002.jpg“ und so fort. Die Zeile
ffmpeg -framerate 1/3 -i
img%03d.jpg -c:v libx264 -r 25 -pix_fmt yuv420p output.mp4
erzeugt aus so nummerierten Bildern ein Video. Unterschiedliche Bildgrößen und Ausrichtungen werden nicht berücksichtigt, das Video hat also dieselbe Auflösung wie das größte Bild. „-framerate 1/3“ sorgt für eine Pause von drei Sekunden zwischen den Bildern, „-r25“ produziert ein Video mit 25 Frames pro Sekunde.
Wenn Bildübergänge und Musikuntermalung gewünscht sind, ferner das Video auf eine übliche Größe skaliert werden soll, dann wird die Ffmpeg-Befehlszeile sehr komplex. Hierfür ist Script „mk_slideshow.bash“ vorzuziehen (https://m6u.de/BASHS). Passen Sie dort den Ein- und Ausgabeordner an, hinter „MP3“ gehört der Pfad zu einer Audiodatei. Ist die Variable leer, wird keine Audiospur erzeugt.

Universeller Entpacker
Gebräuchliche Archivformate sind Tar.gz, Tar.bz2, ZIP, 7z und Rar. Will man die im Terminal entpacken, muss man das dafür nötige Tool verwenden und mit unterschiedlichen Optionen versorgen. Für Tar-Archive verwendet man universell „tar xvf“, für ZIP „unzip“ und bei 7z „7z x“ jeweils gefolgt vom Dateinamen. Mit dem Script „extr“ wird das bequemer (https://m6u.de/BASHS). Die benötigten Archivprogramme müssen allerdings auf dem System installiert sein, etwa die Pakete „7zip“ und „unrar“. Kopieren Sie das Script in den Ordner „bin“ in Ihrem Home-Verzeichnis (siehe „Bash-Basics“). Danach genügt
extr Archiv.tar.bz2
oder
extr Archiv.7z
zum Entpacken im aktuellen Verzeichnis.
Tipp: Sie können die Funktion „extr()“ aus dem Script auch in die Datei „.bashrc“ kopieren und wie oben beschrieben aufrufen.
Schalten mit der Fritzbox
Besitzer einer Fritzbox können Smart-Home-Geräte per Script steuern. Das eröffnet interessante Möglichkeiten der Automatisierung von einem Linux-PC aus. Die Befehle, über die sich die Fritzbox bedienen lässt, hat AVM unter https://avm.de/service/schnittstellen dokumentiert. Unser Script „smart_fritz_terminal.bash“ kann die verbundenen DECT-Schalter ermitteln und Steckdosen ein- und ausschalten. Außerdem kann es die Anrufliste herunterladen und die externe IP-Adresse anzeigen. Bevor Sie das Script nutzen, passen Sie den kommentierten Konfigurationsabschnitt an. Hier erhalten Sie auch ausführliche Infos zu Verwendung. Die Nutzung ist unkompliziert:
smart_fritz_terminal.bash 1 on
Dies schaltet den ersten gefundenen Schalter ein und
smart_fritz_terminal.bash 1 on
schaltet ihn wieder aus.

Grafische Dialoge für Bash-Scripts
Das Tool Dialog ermöglicht einfache grafische Benutzeroberflächen im Terminal.
Sollte es nicht bereits vorhanden sein, installieren Sie das Paket „dialog“. Unser Script „demo_dialog.bash“ zeigt ein Beispiel. Es stellt eine Frage, die Sie mit „Ja“ oder „Nein“ beantworten (siehe Abbildung). Das Ergebnis wird über notify-send als Benachrichtigung ausgegeben. Geben Sie im Terminal den Befehl dialog für eine kurze Hilfe ein. Neben Ja/Nein („–yesno“) können Sie Eingabefelder, Checklisten oder Meldungsboxen verwenden.


