• Keine Ergebnisse gefunden

– L¨osung zur Praktikumsaufgabe 3 –

N/A
N/A
Protected

Academic year: 2021

Aktie "– L¨osung zur Praktikumsaufgabe 3 –"

Copied!
3
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

Betriebssysteme I

– L¨osung zur Praktikumsaufgabe 3 –

Thema: Shellskripte

2. a) Die L¨osung demonstriert beide Formen des test-Statements. Es ist stets eine gute Idee, so viel wie m¨oglich Aspekte der Kommanozeilenparameter zu testen.

Man glaubt gar nicht, auf welche Ideen die Nutzer so kommen.

#!/bin/bash

# no parameters -> exit if [ $# -lt 2 ]

then

echo Usage: $0 \<pattern\> \<file\>

exit 1 fi

# too many parameters -> warning (no exit) if test $BASH_ARGC -gt 2

then

echo $0: Ignoring parameters after $2 fi

# main

echo ’Tiere in der Bibel echo --- echo $1: `grep -c $1 $2`

exit 0

b) Folgender Test kommt hinzu:

# test, whether <file> exists if [ ! -f $2 ]; then

echo $0: Could not find $2. Stop.

exit 2 fi

3. Die Hauptschleife des Programms k¨onnte beispielsweise so aussehen:

read tier

while [ "$tier" != "" ] do

echo `grep -o $tier $1 | wc -l` $tier read tier

done

Anmerkungen:

ˆ Verwenden Sie keine zus¨atzlichen Ausgaben zur

”Men¨uf¨uhrung“ des Nutzers, diese kommen Ihnen dann bei der Umleitung der Standardeingabe ins Gehege!

©Robert Baumgartl, 2008-20 – 1 – 13. November 2020

(2)

Betriebssysteme I

ˆ Kleinschreibung ist Standard bei Variablenbezeichnern, um sie von Umgebungs- variablen, die in Großbuchstaben notiert werden, zu unterscheiden. Dies ist eine Konvention, kein Dogma.

ˆ Um einen Ausdruck im Skript auszuwerten, wird er in Hochkommata (‘) geklam- mert. Die Shell substituiert automatisch das entsprechende Ergebnis.

ˆ Die Shell kennt nur synchrones Warten (bei read). Actionspiele sind also ohne externe Hilfe schwierig zu programmieren.

ˆ Um sp¨ater sch¨on nach der H¨aufigkeit sortieren zu k¨onnen, geben wir zun¨achst die Anzahl, gefolgt vom Suchbegriff (Tier) aus.

ˆ grep kann zwar mit der Option-cauch selbst z¨ahlen, dadurch gehen aber dop- pelte Vorkommen des Suchbegriffs verloren. Besser ist es also, jedes Auftreten des Begriffes auszugeben und dann extern die Zeilen zu z¨ahlen.

Die Datei mit Suchbegriffen (jeweils einer pro Zeile) heiße gesuchte-tiere.txt.

Dann leistet der folgende Aufruf das gew¨unschte:

˜> ./aufgabe-03-03.sh bibel.txt < gesuchte-tiere.txt | sort -n -r

4. Hauptproblem d¨urfte die fehlene Funktion zur direkten L¨angenbestimmung einer Zei- chenkette sein. Ein Behelf ist die Ausgabe jedes Dateinamens mittels echo und an- schließende Z¨ahlung der ausgebenen Bytes (wc). Genauso kann die Funktion in einem einzeiligenawk-Programm realisiert werden (vgl. Aufgabenstellung zum 4.Praktikum).

Ein wenig problematisch ist noch die Nutzung numerischer Variablen, die eigentlich erst im 5. Praktikum (und dort nur fakultativ) behandelt wird.

#!/bin/bash

# no parameters -> exit if [ $# -lt 1 ]

then

echo Usage: $0 \<directory\>

exit 1 fi

# test, whether <dir> exists and is a directory if [ ! -d $1 ]

then

echo $0: $1 does not exist or is not a directory. Stop.

exit 2 fi

# main max=0 cd $1

for file in * do

let length=`echo $file | wc -c`-1 if [ $max -lt $length ]

then

let max=length

©Robert Baumgartl, 2008-20 – 2 – 13. November 2020

(3)

Betriebssysteme I

name=$file fi

done

echo $max $name

# epilogue exit 0

Die L¨osung demonstriert weiterhin die Nutzung der for-Schleife zur Arbeit mit Da- teinamen.

Interessanterweise gibt es f¨ur das wc-Kommando den Switch -L, der das Maximum der L¨ange aller ¨ubergebenen Zeilen ausgibt. Zusammen mit Switch-1, derlsanweist, alle Ausgaben zeilenweise vorzunehmen, k¨onnen wir damit obiges Programm in einen handlichen Einzeiler ¨uberf¨uhren:

#!/bin/sh ls -1 | wc -L

©Robert Baumgartl, 2008-20 – 3 – 13. November 2020

Referenzen

ÄHNLICHE DOKUMENTE

echo -n Es gibt ` grep -o Schlange bibel.txt | wc -l ` \ echo -n Schlangen, ` grep -o Maus bibel.txt | wc -l ` \ echo -n M¨ ause und ` grep -o L¨ owe bibel.txt | wc -l ` \ echo L¨

Nutzen Sie danach eine Umleitung der Standardeingabe an der Kommandozeile, um beim Aufruf des Skriptes nicht mehr interaktiv einzelne Suchbegriffe einzugeben, sondern

Es ist durchaus zul¨ assig, sich zun¨ achst mit den im vorigen Praktikum beschriebenen Mitteln eine Textdatei anzulegen, die nur die Bibelverse (einen pro Zeile enth¨

&amp; }; func ist dies nicht der Fall; es wird f¨ ur pro Aufruf genau eine Shell ge- startet; die Rate der neugestarteten entspricht der Rate der beendeten Shells (, was sich mit

Handelt es sich um keinen numerischen Parameter (also eine Zeichenkette), dann schreibt die Bash eine Fehlermeldung nach stderr, die entsprechend nach /dev/null geleitet werden

ˆ Man kann entweder mit dem Switch -R alle diejenigen Dateien (als Suchmuster) angeben, die nicht mit geladen werden sollen, oder mit dem Switch -A explizit alle angeben, die

Ung¨ unstig an dieser L¨ osung ist, dass man dem zu startenden Kommando nur sehr umst¨ andlich Parameter mitgeben kann (z. ls -la), da die execl-Varianten ihre Argumente als

Allen Verfahren liegt dasselbe Prinzip des Ein- setzungsverfahrens zu Grunde: L¨ ose eine Gleichung nach einer Variablen auf und ersetze in allen anderen Gleichung diese Variable