FH Frankfurt am Main WS 2007/2008. Unix-Praktikum

Ähnliche Dokumente
Bash-Skripting Linux-Kurs der Unix-AG

Linux und Shell-Programmierung Teil 5

Bash-Skripting Linux-Kurs der Unix-AG

Vorbemerkung. Allgemeines zu Shell Scripts. Aufruf. Einfaches Beispiel

Computer & GNU/Linux Einführung Teil 4

Systemverwaltung mittels Skripts

Crashkurs Kommandozeile

Shell-Scripting Linux-Kurs der Unix-AG

Arzu Sanli Ibrahim Canakci

Allgemeines. Shell Programmierung Unix. Kommentar. Vorgangsweise. Mag. Thomas Griesmayer

Shell-Scripting Linux-Kurs der Unix-AG

Bash-Scripting Linux-Kurs der Unix-AG

Arithmetik in der tcsh

Korn-Shell: Einführung in Shellscripte 1. Übersicht: Einführung - 2. Die Kornshell im Detail - 3.Grundlagen der Programmierung

Korn-Shell: Einführung in Shellscripte 1. Übersicht: Einführung 2. Die Kornshell im Detail 3.Grundlagen der Programmierung

UNIX/Linux Lösung. Mär 08, 16 16:11 Seite 1/6

Übung 2 - Betriebssysteme I

Übung: Entwickeln eines Shell-Skripts

Shell-Scripting Linux-Kurs der Unix-AG

Shell-Scripting Linux-Kurs der Unix-AG

Teil 1: Einführung in die Shell. Was ist die Shell? Wichtige Kommandos (1) Einführung in die Shell. Grundlagen der Shell-Programmierung

Skripte. Beispiel. M. Fyta Computergrundlagen 73/93

Übung 4: Schreiben eines Shell-Skripts

UNIX/Linux Lösung. Mär 18, 18 15:34 Seite 1/6

Linux und Shell-Programmierung Teil 6

Linux Kommandozeile: Einfache Skripte. 1 Wiederhohlung. 2 Einfache Skripte

Okt 10, 16 17:29 UNIX/Linux Lösung

Hochschule Für Angewandte Wissenschaften FH München Sommersemester Thomas Kolarz. Folie 1.

Übersicht Shell-Scripten

UNIX Shell-Programmierung

Shell-Programmierung. von Rolf Schmidt für. LUG Frankfurt

Programmierwerkzeuge unter Unix

Linux-Einführung Übung

Shell-Programmierung für Unix und Linux

Unix-Grundkurs 1. Thema heute: Shell-Skripten

Sep 25, 18 8:36 UNIX/Linux Lösung

Der Standard-Editor vi

Fachhochschule Frankfurt am Main Fachbereich 2: Informatik WS 2008/2009

Übungszettel 2a - Python

Shell-Programmierung fur Unix und Linux

Basiskonzepte des Rechnerbetriebs

K Ergänzungen zur Einführung in C

Shell. Oder Konsole suchen im Application Finder. Auch Terminal, Bash oder Kommandozeile genannt. Bash nimmt Befehle entgegen und führt diese aus

Luis Kornblueh. May 22, 2014

Lösung von Übungsblatt 9. (Interprozesskommunikation)

Linux Tutorium. 12. Shellprogrammierung. Version vom :38:56

Linux Prinzipien und Programmierung

Vorsemesterkurs Informatik Sommersemester Aufgabenblatt Nr. 1B

Programmieren in C. Eine Einführung in die Programmiersprache C. Prof. Dr. Nikolaus Wulff

Shell-Programmierung

Unix/Linux Grundlagen für Einsteiger

Linux I II III Res/Pro WN/TT Reguläre Ausdrücke Editoren Scripting. Linux II. 2 Linux II. Reguläre Ausdrücke Editoren Scripting. Ressourcen-Vorkurs

Grundlagen der Programmierung

Einleitung Entwicklung in C Hello-World! Konstrukte in C Zusammenfassung Literatur. Grundlagen von C. Jonas Gresens

Shellkurs Shell, SSH, Skripte... Justus Pfannschmidt, Carola Bothe, Samuel Domiks Freie Universität Berlin

Schleifen: Immer wieder dasselbe tun

Linux II. Reguläre Ausdrücke Editoren Scripting. 2 Linux II. Linux I II III Res WN/TT NLTK XML Weka E Reguläre Ausdrücke Editoren Scripting

Die Shell. Ein Vortrag von Frederik und Michael 1 / 35

Technische Praxis der Computersysteme 1

Arrays. Arrays werden verwendet, wenn viele Variablen benötigt werden. Der Vorteil in Arrays liegt darin, dass man nur eine Variable deklarieren muss

UNIX/Linux Lösung. Mär 14, 17 20:40 Seite 1/6. Prozeßsynchronisation (was ist das?, wo kommt es vor?, Beispiel?):

Der UNIX-Werkzeugkasten Programmieren mit UNIX

Okt 02, 17 12:28 UNIX/Linux Lösung

Vorlesung Unix-Praktikum

Unix-Shells. mehrere Befehle in einer Zeile. bash: Grundlagen. Ein- und Ausgaben umlenken. Befehle: Dateien und Verzeichnisse (1)

Ihr Heimatverzeichnis. Die Ausgangsverzeichnisse für die neu zu erstellenden Verzeichnisse sind folgender Tabelle zu entnehmen:

Kontrollstrukturen -- Schleifen und Wiederholungen

Schleifenanweisungen

Praktische Übung. Die Lernplattformen ILIAS ist mit Stud.IP verbunden, sodass Sie Lernmodule dieser Plattform

Alles, was man auf der Kommandozeile eingeben kann, kann man auch in einem Skript verwenden. Umgekehrt gilt das gleiche.

ZWEITE ÜBUNG ZUR EINFÜHRUNG IN DIE PROGRAMMIERUNG FÜR COMPUTERLINGUISTEN LEONIE WEIßWEILER

Aufgabensammlung IT Shellprogrammierung Teil I

Informatik für Schüler, Foliensatz 2 Ausdrücke, Variablen, Datentypen, Ein- und Ausgabe

Arbeiten mit der Shell Teil 1

Python Intro I. Vorsemesterkurs Informatik Praktischer Teil WS 2013/14. 1.Oktober Vorkurs Informatik - WS 2013/14

06 While-Schleifen. While-Schleifen 1/7 Wiederholung: Schleifen

Einführung Unix Shell

I System-Administration 8

Programmieren in C. Felder, Schleifen und Fließkommaarithmetik. Prof. Dr. Nikolaus Wulff

hue12 January 24, 2017

Vorsemesterkurs Informatik Übungsaufgaben. Tag 4a - Python

Fachhochschule Südwestfalen Wir geben Impulse. Kontrollstrukturen und Schleifen in Octave

U7 POSIX-Prozesse U7 POSIX-Prozesse

Prof. Dr. Stefan Funken, Dipl.-Ing. Christoph Erath 15. Mai WiMa-Praktikum (Matlab 2/9) Einführung in LATEXund Matlab

Python Intro. Vorsemesterkurs Informatik Praktischer Teil WS2012/13. 2.Oktober Vorkurs Informatik - WS 2012/13

SHELL WE BEGIN? EINE EINFÜHRUNG IN DIE SHELL. Max Rosin - ANKÜNDIGUNGEN

Vorsemesterkurs Informatik Sommersemester Aufgabenblatt Nr. 4A

SelfLinux Was ist eine Shell?

Programming 101. Carl Herrmann IPMB & DKFZ

Vorsemesterkurs Informatik Sommersemester Aufgabenblatt Nr. 4A

JavaScript. Dies ist normales HTML. Hallo Welt! Dies ist JavaScript. Wieder normales HTML.

Einstieg in die Informatik mit Java

Kapitel 5. Programmierkurs. Kontrollstrukturen. Arten von Kontrollstrukturen. Kontrollstrukturen Die if-anweisung Die switch-anweisung

Vorlesung Unix-Praktikum

C++ Teil Schleifen. Man kann bestimme Anweisungen in einem Programm mehrfach ausführen lassen. Dazu gibt es in C++ verschiedene Schleifen.

Programmieren in C/C++ und MATLAB

Transkript:

FH Frankfurt am Main WS 2007/2008 Fachbereich 2 UNIX-Praktikum Studiengang Informatik Dr. Joachim Schneider Übungsblatt 9 Unix-Praktikum Lernziele: Kontroll-Strukturen in Shells, Shellskripte Shellskripte Die Unix-Shell ist sowohl eine interaktive Umgebung, um mit dem Rechner zu kommunizieren, als auch eine Programmiersprache. Diesem Aspekt wollen wir uns in den kommenden Übungen zuwenden. Wir behandeln hier die Programmiersprache der Bourne-Shell, da alle Weiterentwicklungen (Korn Shell, Bourne Again Shell also bash) zu ihr kompatibel sind. Die Shell-Programmiersprache läßt es zu, ganze Programme zu schreiben. Diese Programme werden in Dateien abgespeichert und können dann über die Kommandozeile einer Shell ausgeführt werden. Dabei können solche Shellskripte selbst Kommandozeilen beinhalten, in ihnen können Shell-Variablen definiert und verwendet werden, zusätzlich gibt es aber Kontrollstrukturen (Schleifen, bedingte Anweisungen), die es erlauben, logische Abläufe wie in einer gewöhnlichen Programmiersprache zu entwerfen. Wir behandeln hier nur einige der Sprachelemente der Bourne-Shell. Für genauere Details sei auf folgende Quellen verwiesen: Auf meiner Web-Seite (http://www.fourier-series.org) befindet sich ein Tutorial zur Bourne-Shell, das von ihrem Erfinder Steve Bourne stammt a. Es ist sowohl als Text- als auch als PDF-File verfügbar. Ebenfalls auf meiner Web-Seite finden Sie eine Sammlung kleinerer Shellskripte, die aus typischen alltäglichen Anforderungen entstanden sind an diesen Beispielen können Sie im wesentlichen die korrekte Shell-Syntax ersehen. In dem über das Rechenzentrum erhältlichen, schon mehrfach empfohlenen Leitfaden UNIX eine Einführung in die Benutzung werden im Abschnitt Prozeduren Grundlagen zur Shell-Programmierung behandelt. Die Manual-Pages zu SH, KSH93 und auf Linux zu BASH enthalten alle Informationen in kompakter Form. Eine Text-Version der Manual-Page der Bourne-Shell (SH) befindet sich auch auf meiner Web-Seite. a Es wurde aus den troff-sourcen der orginalen Unix Version 7 Dokumentation (http://plan9.bell-labs.com/7thedman) neu formatiert

Folgende Bücher seien für die Shell-Programmierung empfohlen: Brian W. Kernighan, Rob Pike: The UNIX Programming Environment. Kernighan/Pike: Der UNIX-Werkzeugkasten Programmieren mit UNIX. München, Wien. Carl Hanser Verlag, 1986. (Das ist die deutsche Ausgabe des vorigen Titels, die aber zur Zeit nicht im Handel ist.) Arnold Robbins & Nelson H.F. Beebe: Classic Shell Scripting. Sebastopol, O Reilly, 2005. (Von diesem Titel gibt es auch eine Übersetzung in das Deutsche.) Schleifen Wie in gewöhnlichen Programmiersprachen gibt es auch in Shellsprachen mehrere Arten von Schleifen. Wir erwähnen als Beispiel die while-schleife. Beispiel: Die Kommandosequenz while true do date sleep 10 done gibt alle 10 Sekunden das Datum und die Uhrzeit aus (Endlosschleife). Die if-anweisung if [ -e ~/check ] then echo Die Datei ~/check existiert bereits --- Abbruch! exit 8 else touch ~/check echo Die Datei ~/check wurde angelegt... fi Diese Kommandosequenz prüft, ob eine Datei mit Namen check in Ihrem Home- Verzeichnis vorhanden ist. Wenn ja, wird das laufende Shellskript mit dem Befehl exit abgebrochen, dem noch der zurückzuliefende Returncode (hier also 8) mitgegeben wird. Esistiert die Datei check nicht, so wird sie als leere Datei mit dem Befehl touch angelegt und das Programm arbeitet weiter. Mit solch einer Abfrage kann man zum Beispiel für Installationsskripte einen einfachen Lock-Mechanismus implementieren. Page 2

Shellskripte Shell-Programme können interaktiv (durch Eingabe in einem Shell-Fenster) eingegeben werden, dann werden die Befehle des Programms direkt ausgeführt, oder sie können in Dateien gespeichert werden. Im letzten Fall wird das Programm wie jedes andere Programm oder wie andere Kommandos dadurch ausgeführt, daß der Dateiname in einer Shell eingegeben wird und die <Return>-Taste gedrückt wird. Dafür muß die Datei ausführbar gemacht werden, was mit dem Kommando chmod erfolgen kann. Kommentarzeilen sind in der Shell alle Zeilen die mit eventuellem Leerraum gefolgt von einem # -Zeichen beginnen b. Die erste Zeile eines solchen Shellskripts sollte stets eine Information beinhalten, welcher Interpreter das Skript ausführen soll. Dabei müssen die ersten beiden Zeichen #! sein. In der Regel sollte also die erste Zeile lauten: #!/bin/sh Obwohl das eigentlich auch ein Kommentar ist, wird er vom Unix-Kernel nicht als Kommentar behandelt: Diese Zeile bestimmt tatsächlich, von welchem Programm das Shellskript ausgeführt werden wird. Danach sollen die eigentlichen Anweisungen stehen (Definitionen von Variablen, Kommandozeilen, Kontrollanwesungen usw.) Bei der unmittelbaren Ausführung eines solchen Skripts wird der Interpreter, der in der Kopfzeile angegeben ist, gestartet und unter dessen Kontrolle werden die Anweisungen ausgeführt. Eine andere Möglichkeit der Ausführung von Skripten erfolgt mit dem Built-In-Kommando source. In diesem Fall muß die Datei nicht ausführbar sein, es wird keine neue Shell gestartet, die Anweisungen werden ausgeführt, als ob sie unmittelbar in der aktuell laufenden Shell eingetippt würden. Argumente eines Shellskripts Wie direkt ausführbare Programme die also zum Beispiel mit einem C-Compiler erzeugt wurden können auch Shellskripte mit Argumenten aufgerufen werden. Im Programm des Skripts kann auf die Argumente zugegriffen werden mit $1, $2,..., $9 für das erste bis neunte Argument; die Position der Argumente kann mit dem Befehl shift nach vorne verschoben werden, so kann man dann auch auf eine beliebige Anzahl von Argumenten zugreifen. Die Anzahl der Argumente der Kommandozeile, mit der das Skript aufgerufen wird, kann mit $# ermittelt werden. Der Name des Skripts wird über $0 ermittelt. Das ist also dasselbe Konzept, mit dem in C-Programmen int main(int argc, char *argv[]) { return 0; } b Also dem regulären Ausdruck ^[ ]*#.*$ entsprechen Page 3

über argv[] auf die Argumente und über argc auf ihre Anzahl zugegriffen werden kann, es besteht allerdings der Unterschied, daß argc das nullte Argument mitzählt, $# aber nicht. Programmbeispiel: #!/bin/sh # Namen, Anzahl der Argumente und Argumente ausgeben myname="$0" nargs=$# i=0 while [ $# -gt 0 ] do i=$(expr $i + 1) curarg="$1" echo "Argument [${i}] = ${curarg}" # $1 <-- $2, $2 <-- $3,... shift done echo "My name is ${myname}" echo "Number of arguments is ${nargs}" exit 0 Aufgaben 1. Lesen Sie in den Manual Pages zur sh oder zur ksh nach, welche Schleifen und welche Arten von bedingten Anweisungen in dieser Shell verfügbar sind und wie die Syntax dieser Anweisungen aussieht. Lesen Sie außerdem die Manual-Pages für die Befehle true, false und test. 2. Schreiben Sie ein Shellskript, das die gleiche Wirkung hat, wie das folgende C- Programmstück: X = 1; Y = 2; while ( X <= 10 ) { printf("x = %d\n", X); printf("y = %d\n", Y); X = X + 1; Y = Y * 2; if ( Y > 20 ) Page 4

} { } printf("ende: Y = %d\n", Y); break; Hinweis: Sie müssen sich zur Realisierung dieses Programms als Shellskript mit dem Befehl test und dem Befehl expr vertraut machen. Beide sind in den zugehörigen Manual-Pages TEST(1) bzw. EXPR(1) gut dokumentiert; die Befehlsfolge [ <expression> ] ist (fast) vollständig äquivalent zu test <expression> c. 3. Kopieren Sie das Shellskript aus Aufgabe und modifizieren Sie die Kopie so, dass die Werte für X und Y als Argumente übergeben werden. Erweitern Sie das Skript so, daß es robust wird gegen eine falsche Anzahl von Parametern. 4. Informieren Sie sich über den eingebauten Befehl read der Bourne-Shell, kopieren Sie das Shellskript aus Aufgabe 3 und modifizieren Sie die Kopie so, daß die Werte für X und Y von der Tastatur eingelesen werden. Wie könnte man dieses Programm robust gegen Fehleingaben machen d? 5. Schreiben Sie folgende Zeilen in eine Datei (mit einem Namen Ihrer Wahl): ACTDIR= pwd echo "Wir befinden uns in ${ACTDIR}" echo "Nun wechslen wir das Verzeichnis..." cd "/tmp" NEWDIR= pwd echo "Nun befinden wir uns in ${NEWDIR}" (a) Führen Sie die Datei aus mit Hilfe des Kommandos source. Führen Sie anschließend das Kommando pwd aus und lassen Sie sich die Inhalte der Shell- Variablen ACTDIR und NEWDIR anzeigen. Wechseln Sie wieder nach ${ACTDIR}. (b) Gehen Sie in eine neue Shell, machen Sie die Datei ausführbar (durch chmod) und führen Sie sie direkt aus (als Shell-Befehl). Führen Sie anschließend wieder pwd aus und lassen Sie sich ACTDIR und NEWDIR ausgeben. (c) Versuchen Sie, die Unterschiede im Verhalten zu erklären. 6. Erstellen Sie ein Shellskript, das ein Argument den Namen eines Verzeichnisses benötigt, und das für alle Einträge des Verzeichnisses untersucht, ob das betreffende File ein Verzeichnis oder ein reguläres File ist, ob das File lesbar, beschreibbar, ausführbar ist. Ausgegeben werden soll die Anzahl der Verzeichnisse, regulären Files,.... (Benötigte Techniken: Kommando test, for-schleife über alle c Fast, deshalb weil in einigen Shells [] im Gegensatz zu test ein eingebautes Kommando ist, das also schneller ausgeführt werden kann. d Eine Möglichkeit dazu könnte die case-kontrollstruktur bieten. Page 5

Einträge des Verzeichnisses, Hochzählen eines Zählers (expr), Ausgabe mit echo,... ). Versuchen Sie, in dem Skript eine vernünftige Fehlerbehandlung zu realisieren (z.b. Abfrage auf korrekte Zahl von Argumenten, existiert ein Verzeichnis mit dem Namen des Arguments etc.). Hinweis: Für diese Aufgabe soll nicht der find-befehl verwendet werde. 7. Zusatzaufgabe: Erstellen Sie ein Shellskript, welches den Benutzer zuerst auffordert, ein Verzeichnis einzugeben, und danach eine Liste von Kriterien anbietet, nach denen das Verzeichnis durchsucht werden kann. Anschließend wird der Benutzer, abhängig vom gewählten Kriterium, zu einer weiteren Eingabe aufgefordert. (z. B. Benutzername bei der Suche nach Dateien eines bestimmten Eigentümers). Kriterien sollen sein: Dateinamen Benutzernamen Zugriffsberechtigung (oktal)... Sie erstellen damit eine menügeführte interaktive Version des find-befehls, den Sie zur Realisierung dieser Aufgabe verwenden sollen. 8. Zusatzaufgabe: Auf Ihrem Arbeitsplatzrechner befinden sich im Verzeichnis /etc/init.d Skripte zum Starten und Stoppen von Prozessen. Sehen Sie sich einige dieser Skripte an und versuchen Sie zu verstehen, was diese bewirken. Page 6