Lehrauftrag Informatik für Elektrotechnik und Maschinenbau
Übungsblatt 3 - Shell-Scripts
LÖSUNGSVORSCHLÄGE
1. Aufgabe Probieren ist die Grundlage des Studierens ;-)
muss praktisch geprobt werden
2, Aufgabe userinfo
Schreiben Sie ein Script userinfo, das zunächst prüft, ob ein (im Parameter angegebener) User auf der Anlage als User registriert ist und dann die in der passwd-Datei verfügbaren Informationen über diesen User ausgibt.
#!/bin/bash
# Script userinfo user - prüft, ob User registriert ist, gibt Infos aus
if test $# != 1
then
echo "Das Script userinfo muss mit einem Usernamen aufgerufen werden"
exit 1
fi
ypcat passwd | grep $1 >/dev/null # kein Output des Kommandos soll
if test $? = 0
then
echo -e "Userkürzel $1 hat folgenden Namen: \c"
# -e für die Auswertung des \c
ypcat passwd | grep $1 | cut -f5 -d:
echo -e "Homedirectory: \c"
ypcat passwd | grep $1 | cut -f6 -d:
echo -e "Shell: \c"
ypcat passwd | grep $1 | cut -f7 -d:
else
echo "Das Userkürzel $1 existiert nicht"
fi
3. Aufgabe userinfo1
Legen Sie eine zweite Variante des userinfo-Scripts an. In diesem Script soll der Name des Users optionaler Parameter sein, d.h. wenn der Username beim Aufruf nicht mitgegeben wurde, muss er beim Ablauf des Scripts eingelesen werden. Darüber hinaus soll jetzt zusätzlich angegeben werden, wie viel Speicherplatz der User im Homedirectory belegt hat.
#!/bin/bash
# Script userinfo1 user - prüft, ob User registriert ist, gibt Infos aus
if test $# = 1
then
USERKUERZEL=$1
else
echo "Das Script userinfo1 braucht einen Usernamen:"
read USERKUERZEL
fi
ypcat passwd | grep $USERKUERZEL >/dev/null
if test $? = 0
then
echo -e "Userkürzel $USERKUERZEL hat folgenden Namen: \c"
# -e für die Auswertung des \c
ypcat passwd | grep $USERKUERZEL | cut -f5 -d:
echo -e "Homedirectory: \c"
ypcat passwd | grep $USERKUERZEL | cut -f6 -d:
echo "Der belegte Speicherplatz in diesem Verzeichnis:"
du ~ # du steht fuer disk usage
# ~ ist das Homedirectory
echo -e "Shell: \c"
ypcat passwd | grep $USERKUERZEL | cut -f7 -d:
else
echo "Das Userkürzel $USERKUERZEL existiert nicht"
fi
4. Aufgabe mymove
Schreiben Sie ein Script mymove, das nur einen (erforderlichen) Parameter hat.
Es leistet folgendes:
#!/bin/bash
if test $# = 0 -o $# -gt 1
then
echo "mymove muss mit genau einem Parameter aufgerufen werden"
exit 1
fi
if test -r "$1"
then
echo "Wohin soll die Datei $1 gemoved werden?"
read ZIEL
if test -e "$ZIEL"
then
echo "$ZIEL existiert. Darf die Datei geloescht werden (j/n)?"
read ANTWORT
if test "$ANTWORT" = "j"
then
mv $1 $ZIEL
fi
else
mv $1 $ZIEL
fi
else
echo "Die Datei $1 ist nicht lesbar"
fi
5. Aufgabe mygrep
Schreiben Sie ein Script mygrep, das zwei Parameter hat (sonst übliche Fehlermeldung). Der erste Parameter stellt einen Suchstring dar, der zweite Parameter stellt den Dateinamen dar.
Das mygrep soll jeweils für die übergebene Datei zunächst prüfen, ob sie lesbar ist.
Dann soll eine Überschriftszeile ausgegeben werden, die den Namen der Datei enthält.
Dann soll der Suchstring mittels grep in der Datei gesucht werden.
Schließlich soll danach, wenn der Suchstring nicht gefunden wurde, eine entsprechende Bemerkung ausgegeben werden. Dies entfällt, wenn der Suchstring gefunden wurde (denn dann gibt grep ja den Text aus).
#!/bin/bash
if test $# != 2
then
echo "Script mygrep Muster Datei"
exit 1
fi
if test ! -r "$2"
then
echo "Die Datei $2 ist nicht lesbar"
exit 2
fi
echo "Suche $1 in der Datei $2"
grep "$1" "$2"
if test $? != 0
then
echo "Suchstring nicht gefunden"
fi
6. Aufgabe Telefonverzeichnis eines/einer Studierenden
Schreiben Sie die notwendigen drei Scripts für die Verwaltung eines Telefonverzeichnisses.
Nebenbedingung:
Die Adress- und Telefonnummern-Einträge in der Datei verz.tel sollen das (an /etc/passwd angelehnte) folgende Format haben:
Name:Vorname:Ort:(Vorwahl) Telefonnummer
Es sollen möglich sein:
#!/bin/bash
# Script ausgeben, gibt verz.tel aus
sort verz.tel | more # die Datei ist unsortiert
#!/bin/bash
# Script eintragen, liest Infos ein und schreibt sie nach verz.tel
echo "Eintragen einer Telefonnummer"
echo "Bitte geben Sie den Nachnamen ein:"
read NAME
echo "Bitte geben Sie den Vornamen ein:"
read VORNAME
grep "$NAME:$VORNAME" verz.tel
if test $? = 0
then
echo "Diesen Eintrag gibt es schon"
echo "Bitte rufen Sie das Script erneut auf"
exit 1
fi
echo "Geben Sie den Ort ein:"
read ORT
echo "Geben Sie die Vorwahl ein:"
read VORWAHL
echo "Geben Sie die Anschlussnummer ein:"
read NUMMER
echo "$NAME:$VORNAME:$ORT:($VORWAHL) $NUMMER" >> verz.tel
#!/bin/bash
# Script suchen, sucht eine Telefonnummer in der Datei verz.tel
if test $# != 0
then
grep "$*" verz.tel
else
echo "Bitte geben Sie einen Namen ein:"
read NAME
grep "$NAME" verz.tel
fi
7. Aufgabe Schleifen
Kopieren Sie die Scripts userinfo, userinfo1 und mygrep in jeweils neue Dateien ui, ui1 und mg.
Schreiben Sie diese Dateien dann um, so dass die Scripts jeweils mehrere Parameter verarbeiten können.
Wichtiger Hinweis:
Die Abarbeitung mehrerer Parameter erfolgt durch Verarbeitung des jeweils ersten Parameters. Anschließend wird dieser Parameter mittels des shift-Kommandos eliminiert.
Das shift-Kommando rückt alle Parameter $n auf den Platz von $n-1, $1 verschwindet, $# wird um eins verringert.
Beispiel:
vor dem shift: $1=a $2=b $3=c $#=3
dann shift.
nach dem shift: $1=b $2=c $#=2
#!/bin/bash
# Script userinfo user1 user2 user3
# - prüft, ob User registriert sind, gibt Infos aus
if test $# = 0
then
echo "Das Script userinfo muss mit einem Usernamen aufgerufen werden"
exit 1
fi
while test $# != 0
do
ypcat passwd | grep $1 >/dev/null # kein Output des Kommandos
if test $? = 0
then
echo -e "Userkürzel $1 hat folgenden Namen: \c"
# -e für die Auswertung des \c
ypcat passwd | grep $1 | cut -f5 -d:
echo -e "Homedirectory: \c"
ypcat passwd | grep $1 | cut -f6 -d:
echo -e "Shell: \c"
ypcat passwd | grep $1 | cut -f7 -d:
else
echo "Das Userkürzel $1 existiert nicht"
fi
echo "**********"
shift
done
#!/bin/bash
if test $# -lt 2
then
echo "Script mygrep Muster Datei(en)"
exit 1
fi
# $1 enthaelt das Muster, muss also vorab gesondert behandelt werden
MUSTER=$1
shift
# Jetzt stehen auf den $* nur noch Dateinamen
while test $# != 0
do
if test ! -r "$1"
then
echo "Die Datei $1 ist nicht lesbar"
shift
continue # Fortsetzung der Schleife mit dem naechsten Element
fi
echo "Suche $MUSTER in der Datei $1"
grep "$MUSTER" "$1"
if test $? != 0
then
echo "Suchstring nicht gefunden"
fi
shift
done