# Ein komplexes Beispiel

## Aufgabenstellung

Im Laufe der Zeit sammelt sich in einem Dateisystem so allerhand Schrott an, seien es Sicherungsdateien der Editoren (Endung `~`) oder core-Files (Name core) abgestürzter Programme oder Objekt-Dateien übersetzter Programmmodule (Endung .o).

Es wäre sicherlich sinnvoll, ein Shellskript zu haben, was das Dateisystem von solchem Ballast befreit.

Also schreiben wir ein Programm mit folgenden Merkmalen:

- Das Skript soll alle Verzeichnisse nach zu löschenden Kandidaten durchsuchen.
- Durch Optionen kann gesteuert werden, welche Datei-Art zu löschen ist.
- Durch eine zusätzliche Option soll ermöglicht werden, vor jedem Löschen dieses zu bestätigen.

## Eine mögliche Lösung:

Das nachfolgende Shellprogramm löscht im aktuellen Verzeichnis einschließlich aller Unterverzeichnisse core-, Backup- und Objektdateien. Welche Dateien zu entfernen sind, kann in der Kommandozeile angegeben werden.

`1 #!/bin/sh 2 object= 3 tilde= 4 core= 5 inter= 6 for i do 7 case "$i" in 8 -c ) core=core;; 9 -o ) object=.o;; 10 -t ) tilde=\~;; 11 -i ) inter=-i;; 12 esac 13 done 14 for i in $core $object $tilde; do 15 for x in $(find $(pwd) -name "*$i"); do 16 rm $inter $x 17 done 18 done`

## Erläuterungen

Zeile | Bemerkung
1 | `#` leitet normalerweise einen Kommentar ein, es sei denn, es folgt ein Ausrufezeichen. Hieran erkennt die Shell, dass die nachfolgenden Zeilen mit der angegebenen Shell auszuführen sind. So wird ein Shellprogramm portabel und kann auch unter einer anderen Shell aufgerufen werden.
2-5 | Löschen der Variablen, um Konflikte mit gleichnamigen globalen Variablen zu vermeiden.
6, 13 | Die Schleifenvariable `i` wird mit den Kommandozeilenparametern verbunden.
7-12 | Es wird getestet, welche Optionen per Kommandozeile übergeben wurden. Die entsprechenden Variablen werden ggf. belegt.
14, 18 | Die Schleifenvariable wird mit der Liste der gesetzten Optionen verbunden. Jede gesetzte Variable (Option) ist somit ein Element der Liste. Ist keine Variable (Option) gesetzt, terminiert die Schleife sofort (leere Liste).
15,17 | Nach den entsprechenden Dateien (`*core`,`*.o`,`*~`) wird ausgehend vom aktuellen Pfad gesucht. Die Schleifenvariable `x` wird jeweils mit dem Ergebnis von `find` belegt.
16 | Die Dateien werden gelöscht. Wurde die Option `-i` in der Kommandozeile übergeben, expandiert die Zeile zu `rm -i <dateiname>`.

Eine Auflistung der wichtigsten Shellkommandos findet man im Anhang.