




















































































Besser lernen dank der zahlreichen Ressourcen auf Docsity
Heimse Punkte ein, indem du anderen Studierenden hilfst oder erwirb Punkte mit einem Premium-Abo
Prüfungen vorbereiten
Besser lernen dank der zahlreichen Ressourcen auf Docsity
Download-Punkte bekommen.
Heimse Punkte ein, indem du anderen Studierenden hilfst oder erwirb Punkte mit einem Premium-Abo
Community
Finde heraus, welche laut den Docsity-Nutzern die besten Unis deines Landes sind
Kostenlose Leitfäden
Lade unsere Leitfäden mit Lernmethoden, Hilfen zur Angstbewältigung und von Docsity-Tutoren erstellte Tipps zum Verfassen von Haus- und Abschlussarbeiten kostenlos herunter
Das vorliegende Skriptum befasst sich mit der heute in Linux-Derivaten stan- dardmäßig verwendeten Bash-Kommandosprache. Anhand dieses Skriptums sol-.
Art: Mitschriften
Hochgeladen am 28.06.2022
4.4
(29)1 / 92
Diese Seite wird in der Vorschau nicht angezeigt
Lass dir nichts Wichtiges entgehen!
Prof. Dr. Peter Mandl, Björn Rottmüller, M. Sc.
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:
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
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.
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.
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:
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
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.
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:
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
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.