Shell-Programmierung Dr.-Ing. Matthias Sand Lehrstuhl für Informatik 3 (Rechnerarchitektur) Friedrich-Alexander-Universität Erlangen-Nürnberg SS 2009 Shell-Programmierung 1/34 2009-04-27
Inhalt Einleitung Einfache Befehle, Pipelines und Listen Variablen Pfadexpansion Quoting Zusammengesetzte Befehle Funktionen I/O-Umleitung Wichtige Built-Ins Shell-Programmierung 2/34 2009-04-27
Einleitung Was ist eine Shell? Programm, dass verbunden mit einem Terminal läuft, elementare Schnittstelle zur textbasierten interaktiven Bedienung, zur Automatisierung von Befehlsfolgen: Skripte, zahlreiche eingebaute Kommandos, Ergänzungen: einfache Binärprogramme die auf Bedienung per textorientierter Schnittstelle ausgelegt sind. Shell-Programmierung 3/34 2009-04-27
Einleitung (2) Welche Shells gibt es? Historisch : Bourne-Shell (trad. unter /bin/sh), in der GNU-Welt gewachsen: Bourne-Again-Shell (/bin/bash), Ziel-Standard (?): POSIX-Shell (näher an Korn-Shell), Entwicklung in Richtung POSIX: Debian-Almquist-Shell (/bin/dash),... Shell-Programmierung 4/34 2009-04-27
Einleitung (3) Was ist ein Skript? Einfache Textdatei, erste Zeile enthält besonderes Kommentarzeichen mit Angabe des Interpreters (z.b. #!/bin/sh), praktisch beliebige ausführbare Dateien als Interpreter möglich, für den Ausführenden müssen Ausführungsrechte gesetzt sein. Shell-Programmierung 5/34 2009-04-27
Elementares Befehlsverarbeitung Shell liest immer zeilenweise, führt auf der Zeile literale Ersetzungen und Expansionen durch (Aliase, Variablen, Pfade), zerlegt die Zeile bis auf die Ebene der einfachen Befehle in Wortlisten, führt Befehl für Befehl aus. Shell-Programmierung 6/34 2009-04-27
Einfache Befehle Einfache Befehle (Simple Commands) Kommando und Argumente, Built-Ins oder Programme, Ein-/Ausgabe-Umlenkung möglich (s.u.). Shell-Programmierung 7/34 2009-04-27
Pipelines Pipelines Folge von Simple-Commands durch getrennt, Ausgabe (stdout) des i-ten Befehls wird zur Eingabe (stdin) des i+1-ten Befehls, Exit-Status ist der des letzten Simple-Commands. Shell-Programmierung 8/34 2009-04-27
Listen Listen Folgen von Pipelines, getrennt durch, &&, ; oder &, je nach Operator verschiedene Semantik. Shell-Programmierung 9/34 2009-04-27
Listen (2) x y x && y Sequentielle Ausführung, Exit-Status ist logisches ODER von Exit-Status von x und y, Ausführung nicht-strikt. Sequentielle Ausführung, Exit-Status ist logisches UND von Exit-Status von x und y, Ausführung nicht-strikt. Shell-Programmierung 10/34 2009-04-27
Listen (3) x ; y Sequentielle Ausführung, Exit-Status der Liste ist Exit-Status der letzten Pipeline, alle Pipelines werden ausgeführt. x & y Parallele Ausführung, Exit-Status der Liste ist Exit-Status der letzten Pipeline, alle Pipelines werden ausgeführt. Shell-Programmierung 11/34 2009-04-27
Variablen Zuweisung name=value, setzt Variable für die aktuelle Shell, Abfrage $name oder ${name}, Exportieren export name, Variable wird auch in Sub-Shells exportiert, Shell-Programmierung 12/34 2009-04-27
Variablen (2) Spezielle Variablen $$: pid der aktuellen Shell, $?: Exit-Status des letzten Befehls, $#: Anzahl der Befehlszeilenparameter, $0, $1,..., $9: Parameter, $@: Liste aller Parameter,... Shell-Programmierung 13/34 2009-04-27
Variablen (3) Verarbeitung von Parametern shift schiebt alle Parameter um eine Position nach links ($2 nach $1, $3 nach $2, usf.), $# wird dekrementiert. Dadurch werden auch mehr als neun Parameter erreichbar. Shell-Programmierung 14/34 2009-04-27
Variablen (4) Wichtige Umgebungsvariablen $HOME: Pfad zum Home-Verzeichnis des Benutzers, $PATH: Suchpfad für ausführbare Dateien, getrennt durch :, $IFS: Feld-Trenner für die Verarbeitung von Zeichenketten als Listen (z.b. bei Parametern), wenn nicht gesetzt: Whitespaces, $TERM: Terminal-Typ, $PWD: aktuelles Verzeichnis, $OLDPWD: aktuelles Verzeichnis vor dem letzten cd,... Shell-Programmierung 15/34 2009-04-27
Pfadexpansion Strings werden vor Kommandoausführung ersetzt, wenn sie *, [...] oder? enthalten. Sie beschreiben alle Dateinamen, die auf das entsprechende Muster passen: * jeder mögliche String (ohne / ), [...] jedes mögliche Zeichen der Liste,? jedes beliebige Zeichen (bis auf / ). Shell-Programmierung 16/34 2009-04-27
Quoting Escaping Durch Voranstellen von \, spezielle Zeichen ohne ihre (sonst) spezielle Bedeutung: \*, \?, \[, \$,..., Sonderfall: \ vor Zeilenumbruch verlängert die Zeile. Tick-Strings..., alle Zeichen (bis auf ) werden völlig unverändert übernommen. Shell-Programmierung 17/34 2009-04-27
Quoting (2) Double-Quote-Strings "...", alle Zeichen bis auf $, und \ behalten ihre literale Bedeutung, Variablen werden expandiert, Zeichen mit spezieller Bedetung können mit \ erzeugt werden. Back-Tick-Strings list, String, der bei der Ausführung der Liste ausgegeben wird, wird ausgeführt. Shell-Programmierung 18/34 2009-04-27
Zusammengesetzte Befehle Arten Gruppierungen, Auswahlen, Schleifen. Shell-Programmierung 19/34 2009-04-27
Gruppierungen ( l i s t ) { l i s t ; } Die Liste wird (wie) in einer eigenen Sub-Shell ausgeführt, für die Variante mit {} wird keine eigene Shell geforkt, in () gemachte Zuweisungen an Variablen werden danach wieder vergessen, Gruppierungen ermöglichen Weiterleitung der Ausgaben von Befehlslisten. Shell-Programmierung 20/34 2009-04-27
Auswahlen if i f l i s t ; then l i s t ; [ e l i f l i s t ; then l i s t ; ]... [ e l s e l i s t ; ] f i Bedingung ist Exit-Status der jeweiligen Liste, Listen in den elif-ästen werden genau dann ausgeführt, wenn sie erreicht werden. Shell-Programmierung 21/34 2009-04-27
Auswahlen (2) case case word i n [ p a t t e r n [ p a t t e r n ]... ) l i s t ; ; ]... e s a c word wird als String ausgewertet (ggf. Variablen ersetzt), der String wird gegen die Patterns gematcht (Wildcards analog Pfadexpansion), Liste des ersten matchenden Patterns wird ausgeführt. Shell-Programmierung 22/34 2009-04-27
Schleifen for f o r name [ i n word ; ] do l i s t ; done name definiert eine Variable, Schleife durchläuft alle Strings aus word, während der Bearbeitung von list ist name auf den aktuellen String aus word gesetzt. Shell-Programmierung 23/34 2009-04-27
Schleifen while und until while l i s t ; do l i s t ; done u n t i l l i s t ; do l i s t ; done Während der Exit-Status der ersten Liste true bzw. false ist, wird die zweite Liste wiederholt ausgeführt. Shell-Programmierung 24/34 2009-04-27
Funktionen Definition: [ function ] name () { list; }, Parameterübernahme wie bei Skript, return [exit-status]. Shell-Programmierung 25/34 2009-04-27
Suchreihenfolge Enthält ein einfaches Befehlswort kein /, so wird überprüft ob es sich um 1 eine Funktion, 2 eine Built-In oder 3 ein Binary, das in einem der Verzeichnisse aus $PATH erreichbar ist handelt. Die erste gefundene Variante wird ausgeführt. Enthält das Befehlswort /, so wird beim gegebenen absoluten Pfad bzw. relativ zum aktuellen Arbeitsverzeichnis nach einer Ausführbaren Datei gesucht und diese ggf. ausgeführt. Shell-Programmierung 26/34 2009-04-27
Ein-/Ausgabe-Umleitung [n]> file [n]>> file [n]< file [n]>&[m] [n]<< Ausgabe-Filedescriptor n (bzw. 1) wird in Datei umgelenkt (Datei wird überschrieben),... an Datei angehängt, aus Datei gelesen, Verbindung mehrerer Ausgabe-Descriptoren. aus Skript gelesen, Shell-Programmierung 27/34 2009-04-27
Ein-/Ausgabe-Umleitung (2) Here-Document [ n]<< d e l i m i t e r here doc t e x t d e l i m i t e r Der gesamte Text zwischen den beiden delimiter wird in den Standard-Input (oder File n) geleitet, ist der erste delimiter quotiert, wird der Text wörtlich weitergeleitet, andernfalls werden die üblichen Expansionen durchgeführt. Shell-Programmierung 28/34 2009-04-27
Wichtige Built-Ins test t e s t e x p r e s s i o n [ e x p r e s s i o n ] Führt, abhängig von expression eine Reihe von Tests und Vergleichen durch, verschiedene Kategorien: Dateieigenschaften, Stringeigenschaften, Stringvergleiche, Integervergleiche, logische Operatoren, Auswertung zu wahr liefert erfolgreichen Exit-Status. Shell-Programmierung 29/34 2009-04-27
Wichtige Built-Ins (2) exit e x i t [ s t a t u s ] Beendet den aktuellen Shell-Prozess, wenn vorhanden, wird status als Exit-Status zurückgegeben, wenn nicht, der Exit-Status des letzten Befehls. Shell-Programmierung 30/34 2009-04-27
Wichtige Built-Ins (3) read read v a r i a b l e [... ] liest eine Zeile vom Standard-Input, zerlegt die Zeile gemäß $IFS in Wörter, das erste Wort wird der ersten Variablen zugewiesen, das zweite der zweiten usf., bei weniger Variablen als Wörtern wird der gesamte Rest der Zeile der letzten Variablen zugewiesen, bei weniger Wörtern als Variablen wird den restlichen Variablen der Null-String zugewiesen, read kehrt erfolgreich zurück, solange EOF noch nicht erreicht ist. Shell-Programmierung 31/34 2009-04-27
Wichtige Built-Ins (4) echo echo [ n ] a r g s Gibt die Argumente auf dem Standard-Output aus, Argumente werden bei Ausgabe durch Leerzeichen getrennt, nach dem letzten Argument wird ein Zeilenumbruch ausgegeben, Parameter -n unterdückt den Zeilenumbruch. Shell-Programmierung 32/34 2009-04-27
Wichtige Built-Ins (5) printf p r i n t f format [ arguments... ] Gibt Strings formatiert auf dem Standard-Output aus, weitestgehend analog zu printf(3). Shell-Programmierung 33/34 2009-04-27
Wichtige Built-Ins (6) Achtung! Einige Built-Ins, wie test, echo oder printf, unterscheiden sich zwischen verschiedenen Shells z.t. erheblich, existieren nochmal als Binärdatei (/bin/test, /bin/echo). Shell-Programmierung 34/34 2009-04-27