Shell Programmierung I

13 März
Termin: 27 März (1 April)

Theorie | Beispiel | Shell Befehle | Aufgaben


Theoretische Zusammenfassung:
Ein Shell-Befehl kann entweder von der Kommandozeile aufgerufen werden, oder kann man ihn in eine Befehlsdatei (shell script) einschreiben und dann diese Datei laufen lassen. Eine Befehlsdatei ist eine ASCII Datei, worauf das Ausführungsrecht erlaubt ist (mit dem "chmod 755 Dateiname" Befehl), und enthaltet Shell Befehle. Charaktere, womit die Befehle getrennt werden können:;, &&, ||, <CR>
Kommentar kann man nach dem # Charakter schreiben. Am Anfang der Datei können wir ein spezielles Kommentar schreiben, womit der Kommandointerpreter ausgewählt werden kann. In unserem Fall kann das das folgende sein:
#!/bin/bash.

Beispiel Ein Shell-Script, das die folgende Aufgabe löst:
Schreiben Sie eine Befehlsdatei, die zwei Parameter bekommt: ein Verzeichnisname (d) und eine Zahl (n). Für jede Datei des gegebenen Verzeichnisses und dessen Unterverzeichnisses, für welche der Benutzer Lese- und Ausfüfhrungsrechte hat, zeigen Sie die erste n Zeilen am Bildschirm an.

Inhalt der Datei shell1:
----------------------------------------------------------------------------------

#!/bin/bash
# wir überprüfen ob wir 2 Parameter in der Kommandozeile haben; $# -> Anzahl der Parameter aus der Kommandozeile
if [ ! $# -eq 2 ]
then echo usage: shell1 dir nr
     exit 1
fi

# wir überprüfen ob der erste Parameter ein Verzeichnisname ist
if [ ! -d $1 ]
then echo $1 ist kein Verzeichnisname\!
     exit 1
fi


# Der Befehl 'find $1 -perm -u=rx -type f' zeigt jede Datei des Verzeichnisses $1 und
# dessen Unterverzeichnisse, für welche der Benutzer (u) Lese- (r) und Ausführungsrecht 
# (x) hat.
# Anm.: Der Befehl könnte auch folgenderweise geschrieben werden: 
# find $1 -perm -500 -type f
# eine Alternative für den find Befehl ist der Befehl test mit Optionen -f, -r, -x

# die Wirkung der umgekehrten Apostrophe `...` ist, daß der zwischen diesen Apostrophen
# liegende find Befehl wird mit dessen Ausgabe vertauscht (versuchen Sie den Befehl
# 'find $1 -perm -u=rx -type f' von der Kommandozeile auszuführen, so können Sie dessen
# Ausgabe anschauen).
# Bei der Ausführung des for Befehls wird die Zyklusvariable Datei der Reihe nach
# die Zeile der Ausgabe des find Befehls als Wert annehmen.

for Datei in `find $1 -perm -u=rx -type f`
do
        echo $Datei			# wir zeigen den Dateinamen am Bildschirm an
        head -$2 $Datei			# wir geben die erste $2 Zeilen der Datei aus 
done

------------------------------------------------------------------------------------
WICHTIG: Nachdem Sie das Script geschrieben haben, vergissen Sie nicht 
         darauf Ausführungsrecht zu geben (chmod 755 Dateiname)!!!
         Ausführung:
	   [user@linux user]$./shell1 [Parameter]
	   Es kann auch ohne './' ausgeführt werden, wenn der PATH Variable
	   das aktuelle Verzeichnis (also '.') enthaltet.

Nützliche Befehle:

Aufgaben:

1. Scheiben Sie ein Shell Script, das auf das aktuelle Verzeichnis und dessen Unterverzeichnisse für alle Benützer Schreibrecht gibt.

2. Scheiben Sie ein Shell Script, das für jede Textdatei des aktuellen Verzeichnisses und dessen Unterverzeichnisse die letzte Zeile löscht.

3. Scheiben Sie ein Shell Script, das als Parameter ein Verzeichnisname bekommt. Es wird jede C Quellcode von diesem Verzeichnis gelöscht, dann wird der sortierte Inhalt jeder ASCII Datei von diesem Verzeichnis am Bildschirm angezeigt.

4. Scheiben Sie ein Shell Script, das Benutzernamen von der Standardeingabe (Tastatur) einliest (diese werden also nicht als Parameter gegeben). Nach jeder eingabe soll das Script die letzte 3 Anmeldungen dieses Benutzers im aktuellen Monat anzeigen. Wenn der Benutzer in diesem Monat noch nicht angemeldet war, soll das Script den Text ”Benutzer x war noch nie angemeldet.” ausgeben.

5. Scheiben Sie ein Shell Script, das für jeden, im System existierenden Benutzer, zeigt deren Benutzername, den vollständigen Namen, und das Heimatverzeichnis an. (diese Informationen findet man in der /etc/passwd Datei)

6. Scheiben Sie ein Shell Script, das als Parameter ein Verzeichnisname bekommt, und bezeichnet die Anzahl der Zeilen für jede Textdatei von diesem Verzeichnis und dessen Unterverzeichnisse. Last uns annehmen, dass im gegebenen Verzeichnisse gibt es nur Texdateien.

7. Scheiben Sie ein Shell Script, das als Parameter zwei Dateinamen bekommt. In der ersten gibt es Benutzernamen, in der zweiten ein beliebiger Text. Das Script wird für jeden Benutzer der ersten Datei ein E-Mail schicken, dessen Text der Inhalt der zweiten Datei ist.

8. Scheiben Sie ein Shell Script, das die Anzahl der Prozeße des, als Parameter gegebenes Benutzers angibt.

9. Scheiben Sie ein Shell Script, das für jeden, im System angemeldeten Benutzer zeigt am Bildschirm den vollständigen Namen und der Arbeitsplatz, woher er sich angemeldet hat, an.

10. Scheiben Sie ein Shell Script, das den Inhalt des aktuellen Verzeichnisses in 3 verschiedenen Formen anzeigt:
– alphabetisch, nach dem Dateinamen geordnet
– nach dem Datum der letzten Änderung geordnet
– nach der Dateigröße geordnet


Anmerkung: Obwohl man nur eine einzige Aufgabe lösen soll, ist es für die weitere Arbeit wünschenswert mehrere - verschiedene Arten von - Aufgaben zu lösen.