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