Docsity
Docsity

Prüfungen vorbereiten
Prüfungen vorbereiten

Besser lernen dank der zahlreichen Ressourcen auf Docsity


Download-Punkte bekommen.
Download-Punkte bekommen.

Heimse Punkte ein, indem du anderen Studierenden hilfst oder erwirb Punkte mit einem Premium-Abo


Leitfäden und Tipps
Leitfäden und Tipps

Grundlagen der Bash-Programmierung, Mitschriften von Programmierung

Das vorliegende Skriptum befasst sich mit der heute in Linux-Derivaten stan- dardmäßig verwendeten Bash-Kommandosprache. Anhand dieses Skriptums sol-.

Art: Mitschriften

2021/2022

Hochgeladen am 28.06.2022

unbekannter Benutzer
unbekannter Benutzer 🇩🇪

4.4

(29)

1 / 92

Toggle sidebar

Diese Seite wird in der Vorschau nicht angezeigt

Lass dir nichts Wichtiges entgehen!

bg1
Grundlagen der Bash-
Programmierung
Begleitmaterial zu den Übungen
im Kurs Wirtschaftsinformatik II
Bachelorstudium Wirtschaftsinformatik
Sommersemester 2016
Prof. Dr. Peter Mandl, Björn Rottmüller, M. Sc.
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff
pf12
pf13
pf14
pf15
pf16
pf17
pf18
pf19
pf1a
pf1b
pf1c
pf1d
pf1e
pf1f
pf20
pf21
pf22
pf23
pf24
pf25
pf26
pf27
pf28
pf29
pf2a
pf2b
pf2c
pf2d
pf2e
pf2f
pf30
pf31
pf32
pf33
pf34
pf35
pf36
pf37
pf38
pf39
pf3a
pf3b
pf3c
pf3d
pf3e
pf3f
pf40
pf41
pf42
pf43
pf44
pf45
pf46
pf47
pf48
pf49
pf4a
pf4b
pf4c
pf4d
pf4e
pf4f
pf50
pf51
pf52
pf53
pf54
pf55
pf56
pf57
pf58
pf59
pf5a
pf5b
pf5c

Unvollständige Textvorschau

Nur auf Docsity: Lade Grundlagen der Bash-Programmierung und mehr Mitschriften als PDF für Programmierung herunter!

Grundlagen der Bash-

Programmierung

Begleitmaterial zu den Übungen

im Kurs Wirtschaftsinformatik II

Bachelorstudium Wirtschaftsinformatik

Sommersemester 2016

Prof. Dr. Peter Mandl, Björn Rottmüller, M. Sc.

II

Vorwort

Das vorliegende Skriptum befasst sich mit der heute in Linux-Derivaten stan- dardmäßig verwendeten Bash-Kommandosprache. Anhand dieses Skriptums sol- len Grundlagen zu Bash sowie erste Programmiertechniken zur Entwicklung von Bash-Programmen vermittelt werden.

Der Schwerpunkt liegt im ersten Teil im Kennenlernen wichtiger Konzepte der Bash sowie im Erlernen der wichtigsten Kommandos, wobei für das Verständnis einiger grundlegender Aspekte auch auf Linux-Basiswissen eingegangen wird. Im zweiten Teil werden die einführenden Konzepte zur Entwicklung von kleineren Bash-Programmen vorgestellt.

Das Skriptum enthält einige Übungen, die während der Laborstunden zu bearbei- ten sind.

Lernziele sind:

  • Linux-Grundkonzepte, die für die Bash-Programmierung nützlich sind, kennenlernen Hierzu gehören die Konzepte des Linux-Dateisystems und von Linux-Prozessen sowie das Linux-Berechtigungskonzept. Auch der Startvorgang eines Linux-Systems gehört dazu.
  • Die Bash-Kommandosyntax sowie die grundlegenden Kommandos kennen- lernen und anwen den können.
  • Grundlagen der Bash-Programmierung kennenlernen und kleine Shellskrip- te schreiben können.

Das Skriptum dient im Kurs Wirtschaftsinformatik II (Bachelorstudium Wirt- schaftsinformatik) als Basis für die begleitenden Übungen zur Bash- Programmierung.

Wir bedanken uns bei allen Studierenden und KollegInnen für Ihre Anregungen sowie bei allen, die an diesem Skriptum mitgewirkt haben, insbesondere bei Tobias Roithmeier und Felix Kraus.

München, im März 2016

Peter Mandl, Björn Rottmüller

Inhaltsverzeichnis

Inhaltsverzeichnis

1 Einführung

1 Einführung

Dieses Kapitel gibt einen ersten Einblick in das Betriebssystem Linux und in die Shellp-Programmierung, soweit dies für das Verständnis der Bash erforderlich ist. Die wichtigsten Linux-Derivate und einige heute verfügbare Shell-Dialekte werden kurz vorgestellt.

Zielsetzung

Der Studierende soll einen Überblick über die verschiedenen Linux-Derivate und Shell-Dialekte erhalten. Er soll am Ende des Kapitels in der Lage sein, sich an ei- nem Linux System an- und abzumelden, sowie eine entsprechende Shell zu starten und beenden.

Wichtige Begriffe

Linux, Linux-Derivat, Linux-Distribution, Login, Logout, Terminal, Shell, Bash.

1.1 Überblick über Linux-Derivate

Der 25. August 1991 gilt als die von unterschiedlichen Quellen verifizierte Ge- burtsstunde von Linux, an diesem Tag kündigte der finnische Student der Univer- sität Helsinki, Linus Benedict Torvalds, den ersten Kernel seines Betriebssystems via Usenet-Posting an. Aus einem selbstgeschriebenen Terminalemulator entwi- ckelte sich ein vollständiges Betriebssystem, das schließlich als „Linux“ bezeichnet wurde. Daraus zweigen bis heute unterschiedliche Distributionen ab, welche sich in einigen Aspekten unterscheiden. Gemeinsam ist ihnen aber der Kernel, also das Herzstück des Betriebssystems. Obwohl Andrew Tanenbaum, der Entwickler des Betriebssystems „MINIX“ damals behauptete, Linux sei obsolet, ist Linux heute das meistgenutzte Betriebssystem im professionellen und wissenschaftlichen Um- feld. Etliche Supercomputer, darunter ein Großteil der NASA, werden unter Linux betrieben. Anfang 1992 kündigte Linus Torvalds eine Lizenzänderung an, Ende 1992 wurde die erste Version unter einer neuen Lizenz, der GNU General Public License veröffentlicht. Diese Lizenz erlaubt das Verwenden, Untersuchen, Verbrei- ten und Verändern durch Endbenutzer.

1 Einführung

Das bekannteste Desktop-Linux-Derivat ist wohl Ubuntu. Es wird kostenlos be- reitgestellt. Dies spiegelt sich auch im Namen des Debian-Derivates wider, denn „Ubuntu“ kommt aus den Sprachen der afrikanischen Völker Zulu und Xhosa und steht für „Menschlichkeit“ und „Gemeinsinn“. Der Schwerpunkt liegt auf der Be- nutzerfreundlichkeit, die Einstiegshürde für Linux-Neulinge ist vergleichsweise gering.

Android ist wohl das unbewusst am meisten genutzte Betriebssystem, das auf einem Linux-Kernel aufsetzt. Auch von Android werden Derivate gelistet, z.B. das Fire OS, welches von Amazon für eigene Produkte (z. B. Kindle, Fire Phone) ver- wendet wird. Schließlich ist noch das von Google entwickelte Chrome OS zu nen- nen.

Abbildung 1-1: Entwicklung von Linux und den wichtigsten Distributionen

1.2 Bourne, Korn, C-Shell, Bash, …

Eine Shell ist in Linux ein Kommandointerpreter, der in einem Terminal ausge- führt wird. Die Shell ist auf den ersten Blick vergleichbar mit der Kommandozeile (Programm cmd.exe) aus der Microsoft-Welt. Neben dem Ausführen einfacher, einzelner Befehle ermöglicht eine Shell unter Linux die Entwicklung und Ausfüh- rung äußerst leistungsfähiger Programme (sog. Shell-Skripte), die in der Praxis

MINIX (1987)

Linux 1.0 (1994)

UNIXe Tanenbaum

CentOS

Debian RedHat

Erste Veröffentlichung: 1991

Linux 2.0 (1996) ... Ein gemeinsamer Kernel als Basis für mehrere Linux-Distributions

SUSE

Enterprise Linux Fedora

Chrome OS

Google Android

Linux heute (^) 4.4 (2016)

Ubuntu (^) OpenSUSE Fire OS

Amazon

1 Einführung

zum Beispiel zur Administration von Serverrechnern eingesetzt werden. So wer- den beispielsweise auf Serverrechnern automatische Backups von Dateien mit Shell-Skripten realisiert.

Unter einer Shell versteht man die traditionelle Benutzerschnittstelle unter Unix- und Unix-ähnlichen Betriebssystemen. Der Begriff Shell ist allerdings als Oberbe- griff für verschiedene Kommandozeileninterpreter zu verstehen, sodass viele un- terschiedliche „Shells“ existieren. Diese unterscheiden sich meist in den verfügba- ren Befehlen bzw. in der Syntax der Befehle. Die gängigsten Shells sollen kurz er- wähnt werden:

  • Bourne-Shell (sh): Die Bourne-Shell ist Vorfahre vieler heutiger Shells. Noch heute finden sich in vielen Unix-Distributionen Nachfolger der Bourne-Shell.
  • Weitere Shells sind die Korn-Shell (ksh), die C-Shell (csh), die Thompson- Shell (osh) und die TENEX-C-Shell (tcsh). Die Korn-Shell wurde für Unix System V entwickelt, die C-Shell entstand für Berkeley-Unix, die Thomson- Shell war in den 70er-Jahren die Unix-Standard-Shell und wurde später durch die Bourne-Shell ersetzt. Die TENEX-C-Shell ist eine Weiterentwick- lung der C-Shell und wird heute noch häufig unter Linux und auch unter Mac OS X verwendet.
  • Bash (Bourne-again-shell): Die Bash ist eine Weiterentwicklung der Bourne- Shell und heute die Standard-Shell für viele Linux-Distributionen. Sie ent- hält viele Merkmale der anderen Shells. Bash ist auch unter Mac OS X und vielen anderen Unix-Derivaten verfügbar.

Die meisten Shells bieten ähnliche Möglichkeiten, teilweise mit identischer, aber auch mit unterschiedlicher Syntax an. Beispielhafte Funktionen sind das Starten von Programmen in einem eigenen Prozess sowie die Umlenkung von Ein- und Ausgaben, welche die Programme benötigen bzw. produzieren (z.B. Umlenken der Ausgabe eines Programms in eine Datei oder in die Eingabe für ein weiteres Pro- gramm). Auch Kontrollstrukturen wie Schleifen (for, while, ...) und Bedingungen (if – then – else) werden unterstützt, so dass man ganze Shell-Programme als Folge von Shellkommandos, die in Kontrollstrukturen eingebettet werden, entwickeln kann. Dies nennt man auch Shell-Programmierung. Diese Shell-Programme wer- den in Editoren geschrieben, können in Dateien, als sog. Shell-Skripte abgelegt und in der Kommandozeile durch Angabe des Dateinamens zum Ablauf gebracht wer- den.

1 Einführung

Hinweis: Das Zeichen „$“ wird auch als Kommando-Prompt (engl. “auffordern“) bezeichnet und kann – je nach Einstellung – variieren. Es ist sogar über die Shell beliebig um zusätzlichen Informationen (z.B. Rechnername, Benutzername, Datum, …) erweiterbar.

2 Grundlegende Konzepte

2 Grundlegende Konzepte

Zielsetzung des Kapitels

Der Studierende soll am Ende des Kapitels die grundlegenden Konzepte von Linux (Datei, Dateisystem, Verzeichnis, Prozess, Umgebungsvariablen, reguläre Ausdrücke) erläutern können. Ebenso soll der Studierende die Kommandosyntax und grundlegende reguläre Ausdrücke kennen und anwenden können.

Wichtige Begriffe

Prozess, Datei, Verzeichnis, Verzeichnisbaum, Umgebungsvariable, regulärer Ausdruck.

2.1 Linux-Verzeichnisse und Linux–Dateien

Das Linux-Dateisystem ist logisch in einer hierarchischen Baumstruktur organisier, die heute einer Standardisierung unterliegt. Der Standard wird als Filesystem Hie- rarchy Standard (FHS) { XE "FHS" } bezeichnet. FHS ist eine Richtlinie für die logi- sche Verzeichnisstruktur Unix-ähnlicher Betriebssysteme und wird von der Linux Foundation (Linux Foundation 2016), einem gemeinnützigen Konsortium gepflegt.

Das Dateisystem beginnt mit einer „Wurzel“ (auch Rootverzeichnis genannt), die mit dem Symbol „/“ beginnt und ist in Subverzeichnisse strukturtiert. Die folgende Tabelle beschreibt die wichtigsten Subverzeichnisse unter dem Rootverzeichnis, die in einem FHS-konformen Dateisystem vorhanden sein sollten. Nicht jede Dis- tribution hält sich genau an die Vorgaben. Unter jedem Subverzeichnis kann natür- lich wieder ein komplexer Unterbaum liegen.

Bezeichnung Inhalt /bin Binärdateien, grundlegende Befehle /boot Bootloader zum Starten des Systems /dev Gerätedateien, externe Geräte (z.B. Festplatte) werden in sog. Gerätedateien beschrieben, die aus Sicht des Anwender wie eine einfache Datei aussehen.

2 Grundlegende Konzepte

Beim Systemstart werden auch schon spezielle Systemprozesse erzeugt. Prozesse bekommen die Namen der in ihnen laufenden Programme. Einige wichtige Sys- temprozesse sind initd bzw. systemd, inetd, cron und syslogd.

Während ihrer Laufzeit wird ihnen ein eindeutiger Identifier, die sog. Prozess- Identifikation oder PID zugeordnet. Ein Prozess, der einen anderen erzeugt, wird als Elternprozess bezeichnet. Der neu erzeugte Prozess heißt Kindprozess.

Auch die Prozesse sind damit in einer Baumstruktur angeordnet. Der erste Pro- zess, der im System gestartet wird (je nach Statrprozedere ist das z.B. der initd- Prozess oder der systemd-Prozess oder unter Mac OS X der launchd-Prozess) erzeugt weitere Prozesse, diese wiederum neue und so entsteht der Prozessbaum. Wenn man innerhalb einer Bash-Session ein Kommando aufruft, wird dies in ei- nem eigenen Prozess ausgeführt. Es wird also von der Bash ein Kindprozess für die Ausführung des Kommandos erzeugt.

2.3 Kommandosyntax { XE "Kommandosyntax" }

Die Bash ist ein Kommandointerpreter, der Eingabezeichen untersucht und ein Kommando erkennen muss. Erst wenn ein Kommando syntaktisch fehlerfrei iden- tifiziert wurde, kann es ausgeführt werden. Dazu braucht es einer speziellen Sprachdefinition. Um Kommandos zu beschreiben ist eine Metasyntax erforderlich. Hierzu soll ein erster Einstieg gegeben werden. Ein Bash-Kommando ist allgemein wie folgt aufgebaut:

Kommandoname [] []

Kommandoname gibt die eindeutige Bezeichnung eines Kommandos an. Der Kommandoname kann - muss nicht – um eine Liste von Optionen ergänzt wer- den. Optionen beginnen normalerweise (nicht in jedem Fall) mit den Zeichen „- “ und sind durch einen Buchstaben gekennzeichnet. Anschließend können Para- meter (Argumente) angegeben werden. Die eckigen Klammern deuten an, dass die Eingaben optional, also nicht zwingend sind. Jedes Kommando hat natürlich seine eigenen Optionen und Argumente.

Bevor wir auf Bash-Kommandos im Einzelnen eingehen, sollen zunächst allgemei- ne Aspekte zur Syntax erläutert werden. Man spricht hier auch von der Metasyn- tax.

Man unterscheidet interne und externe Kommandos. Interne Kommandos startet die Bash selbst, sie sind also Bestandteil der Bash. Externe Kommandos führt die Bash nicht selbst aus, sondern startet dafür eine ausführbare Datei (z.B. ein eigenes

2 Grundlegende Konzepte

Bash-Skript oder ein Programm. Die Kommandos ls und pwd sind beispielsweise externe Kommandos, während es sich bei cd, echo, exit usw.um interne Kom- mandos handelt. Externe Kommandos müssen über den eingestellten Suchpfad (Umgebungsvariable PATH, siehe weiter unten) im Zugriff sein. Es können beliebi- ge Programme, auch selbsentwickelte Bash-Skripts sein. Für die Nutzung in der Bash spielt es aber keine wesentliche Rolle, ob es sich um ein internes oder externes Kommando handelt.

Eine Zeichenfolge, die von der Bash als zusammengehörig betrachtet wird, be- zeichnen wir als Token. Ein Bezeichner oder Name ist dann ein Token, das nur aus alphanumerischen Zeichen und Unterstrichen besteht und mit einem Buchstaben oder Unterstrich beginnt. Grundsätzlich wird zwischen Groß- und Kleinschrei- bung unterschieden.

Die folgende Tabelle gibt die in der Bash verwendeten Sonderzeichen an:

Sonderzeichen Bedeutung | & ; ( ) < > Leerzeichen Tabulator Zeichen dienen als Trenner für Tokens und haben unterschiedliche Funktionen. „|“ ist z.B. das Pipe-Symbol (siehe unten). Leerzeichen, Tabulator, Zeilenumbruch sind Trennzeichen, die in einer speziellen Umgebungsvariablen mit dem Namen IFS (Internal Field Separator) definiert sind. Umgebungsvariablen werde weiter unten eingeführt. || & && ( ) |! Newline Operatoren, „&&“ ist z.B. das logische Und-Symbol, „!“ die logische Negation. case do done elif else esac fi for function if in select then until while time

Reservierte Wörter mit Sonderbedeutun- gen für Anweisungen in der Bash. Die Schlüsselwörter case, if, do, ... werden in Sprachkonstrukten genutzt. ` ´ “ Die Apostrophe haben in der Bash eine besondere Bedeutung und werden unter dem Begriff „Quoting“ noch erläutert.

2 Grundlegende Konzepte

Allgemeine Syntax für die Zuweisung:

= Nutzungsbeispiele:

HOME=/home/mandl PATH=/bin PATH=$HOME

Hallo=“Hallo Linux“

2.7 Heimatverzeichnis und aktuelles Verzeichnis

Jedem Benutzer wird ein spezielles Verzeichnis im Dateisystem von Linux zuge- ordnet. Der Verzeichnisname stimmt in der Regel mit dem Benutzernamen überein. Dieses Verzeichnis wird als Heimatverzeichnis oder Home-Verzeichnis bezeichnet. In diesem Verzeichnis wird man nach dem Login-Vorgang positioniert. Im Dateisys- tem wird es üblicherweise unter dem Subverzeichnis /home angelegt. In der Um- gebungsvariable $HOME wird der Name des aktuellen Home-Verzeichnisses ge- speichert.

Im Home-Verzeichnis kann man seine eigenen Dateien und Verzeichnisse verwal- ten und hat dazu alle Rechte. Möchte man Dateien in anderen Verzeichnissen (z.B. in Home-Verzeichnissen anderer Benutzer) bearbeiten, so benötigt man meist spe- zielle Rechte. Das Rechtekonzept von Linux werden wir weiter unten noch genau- er betrachten. Ein spezieller Benutzer, der sog. Superuser, darf alle Dateien im gesamten Dateisystem bearbeiten.

Mit dem Kommando cd (change Directory), das wir später noch kennenlernen werden, können wir z.B. von jeder Position im Dateisystem auf das Home- Verzeichnis zurückkommen, in dem wir einfach folgendes Kommando in der Bash eingeben:

cd Alternativen: cd $HOME

cd ~

2.8 Reguläre Ausdrücke

Reguläre Ausdrücke { XE " Reguläre Ausdrücke" } (Regular Expressions) erleich- tern das Arbeiten in der Bash. Bei der Verwendung von bestimmten Linux- oder

2 Grundlegende Konzepte

Bash-Befehlen bietet es sich an, auf reguläre Ausdrücke zurückzugreifen. Damit muss nicht mehr jede Datei einzeln angesprochen werden, sondern es können z.B. Ausdrücke erstellt werden, die eine zusammengehörige Menge an Dateien filtern. Einen kurzer Auszug aus der Liste der Möglichkeiten bietet folgende Tabelle:

Syntax Bedeutung

  • Beliebig viele Zeichen. ? Genau für ein Zeichen. [a-z] Genau ein Zeichen zwischen a und z. [!Bb] Weder ein ‚B’ noch ein ‚b’ erlaubt. {info, hinweis, hilfe}.txt Eine der drei Dateien info.txt, hinweis.txt oder hil- fe.txt. b|info Alle Dateien, die mit ‚b’ oder ‚info’ beginnen.

Weiterführende Informationen zu regiulären Ausdrücken finden sich beispiels- weise unter (Expressions 2016). Im Folgenden finden Sie erste Anwendungen von regulären Ausdrücken. Die weitere Nutzung folgt in Übungen.

Beispiel Beschreibung cp .txt test Kopiert sämtliche Dateien mit der Endung txt in den Ord- ner (Verzeichnis) mit der Bezeichnung test. Voraussetzung: Der Order test ist vorhanden und Dateien mit dieser Endung existieren. mv ??april april Verschiebt alle Dateien, in deren Dateinamen das Wort ap- ril vorkommt in ein Verzeichnis namens april. Voraussetzung: Der Ordner april ist vorhanden und Bei- pieldateien mit Namen wie beispielsweise 01april2009.txt oder 09april2007.txt sind eben- falls vorhanden. rm bin/*.class Löscht alle Dateien, die die Zeichenfolge *.class enthal- ten, aus dem Verzeichnis bin.