Shell-Programmierung
Transcription
Shell-Programmierung
Shell-Programmierung Arzu Sanli Ibrahim Canakci 2 Arzu Sanli Ibrahim Canakci Agenda • • • • • • • • • Projektziel Was ist die Shell? Shells im Vergleich Shell vs. C Wofür Shell-Programmierung? Shell-Programmierung Beispielprogramm Schlusswort Quellen 3 Arzu Sanli Ibrahim Canakci Projektziel Da die Möglichkeiten in der ShellProgrammierung schier unbegrenzt sind, begrenzen wir uns auf die Grundlagen und wollen diese mit einigen kleinen Beispielprogrammen verdeutlichen. 4 Arzu Sanli Ibrahim Canakci Geschichte • 1978 - S.R. Bourne entwickelt Bourne Shell • 1987 - Weiterentwicklung der Bourne-Shell: Bourne-Again-Shell • Ende der 80er Jahre – D. Korn entwickelt KornShell • Unterteilung in 2 Familien: ▫ Bourne-Familie: sh, ksh, bash ▫ C-Shell-Familie: csh, tcsh 5 Arzu Sanli Ibrahim Canakci Was ist die Shell? • Schnittstelle zwischen dem Kernel und dem Benutzer • Einsatzgebiete der Shell: ▫ Systemadministration ▫ ältere Rechner 6 Arzu Sanli Ibrahim Canakci Shells im Vergleich • Shell als Kommandointerpreter Merkmal Kompatibilität zur Bourne-Shell Überschreibschutz für Dateien sh ksh bash x x x x x Existenz einer Logout-Datei Erzeugen von Zufallszahlen Vervollständigung von Kommandonamen x csh tcsh x x x x x x x 7 Arzu Sanli Ibrahim Canakci Shells im Vergleich (2) • Shell als Programminterpreter Merkmal sh ksh bash Kompatibilität zur Bourne-Shell x x x Shell-Funktionen x x x Bearbeitungsmöglichkeiten für Pfad- und Dateinamen Unterstützung der Verarbeitung von Kommandozeilenparametern Lokale Variablen in ShellFunktionen x x x x x csh tcsh x x 8 Arzu Sanli Ibrahim Canakci Shell vs. C Shell-Programmierung C-Programmierung • • • • • Kompiliert • Mehrmaliges Übersetzen • Keine Portabilität • Hohe Geschwindigkeit Interpretiert Kein Übersetzen Portabilität Niedrige Geschwindigkeit 9 Arzu Sanli Ibrahim Canakci Wofür Shell-Programmierung? • Wiederkehrende Kommandos zusammenfassen • Programme zur Erledigung von Aufgaben 10 Arzu Sanli Ibrahim Canakci Shell-Programmierung (1) • • • • • Variablen Quoting Meta-Zeichen Befehlsformen Datenströme 11 Arzu Sanli Ibrahim Canakci Variablen • Keine Deklaration • Variablenname aus Buchstaben, Ziffern und Unterstrich • Inhalt einer Variablen: $variable • Vorsicht bei der Benutzung von Variablen!!! 12 Arzu Sanli Ibrahim Canakci Vordefinierte Variablen Variable Bedeutung $n Aufrufparameter mit der Nummer n $* Enthält alle Aufrufparameter in einem String $@ Enthält alle Aufrufparameter, wobei jeder für sich ein separater String bleibt $# Anzahl der Aufrufparameter $? Rückgabewert des letzten Kommandos $$ Prozessnummer der aktiven Shell $! Prozessnummer des letzten Hintergrundprozesses $ERRNO Fehlernummer des letzten fehlgeschlagenen Systemaufrufs $IFS Feldseparator, wird beispielweise beim Lesen mittels read benutzt $PATH Pfad, in dem nach ausführbaren Kommandos gesucht wird $PWD Aktuelles Verzeichnis 13 Arzu Sanli Ibrahim Canakci Variablen-Substitution Variable Bedeutung Variable=Wert Setzt die Variable auf den Wert ${Variable} Nutzt den Wert von Variable ${Variable:-Wert} Nutzt den Wert von Variable. Falls die Variable nicht gesetzt ist, wird der Wert benutzt. ${Variable:=Wert} Nutzt den Wert von Variable. Falls die Variable nicht gesetzt ist, wird der Wert benutzt und die Variable erhält den Wert. ${Variable:?Wert} Nutzt den Wert von Variable. Falls die Variable nicht gesetzt ist, wird der Wert ausgegeben und die Shell beendet. Wenn kein Wert angegeben wurde, wird der Text parameter null or set ausgegeben. ${Variable:+Wert} Nutzt den Wert, fall die Variable gesetzt ist, andernfalls nicht. 14 Arzu Sanli Ibrahim Canakci Variablen-Substitution Beispiel 15 Arzu Sanli Ibrahim Canakci Quoting • Verhindern der Expansion einer Variablen • Zeichen verlieren ihre Sonderbedeutung Zeichen Bedeutung ; Befehls-Trennzeichen & Hintergrund-Verarbeitung () Befehls-Gruppierung | Pipe <>& Umlenkungssymbole *?[]~+-@! Meta-Zeichen für Dateinamen ‘‘ Befehls-Substitutionen $ Variablen-Substitutionen [newline] [space] [tab] Wort-Trennzeichen Zeichen zum Quoten: •““ •‘‘ •\ 16 Quoting Beispiel Arzu Sanli Ibrahim Canakci user:~$ echo ‘Ticks “schützen“ Anführungszeichen‘ Ticks “schützen“ Anführungszeichen user:~$ echo “Ist dies ein \“Sonderzeichen\“?“ Ist dies ein “Sonderzeichen“? user:~$ x=100 user:~$ echo “Der Wert von \$x ist $x“ Der Wert von $x ist 100 17 Arzu Sanli Ibrahim Canakci Meta-Zeichen • Möglichkeit mehrere Dateien gleichzeitig anzusprechen • Wildcards, Jocker-Zeichen oder Platzhalter Zeichen Bedeutung * Eine Folge von keinem, einem oder mehreren Zeichen ? Ein einzelnes Zeichen [abc] Übereinstimmung mit einem beliebigen Zeichen in der Klammer [a-q] Übereinstimmung mit einem beliebigen Zeichen aus dem angegebenen Bereich [!abc] Übereinstimmung mit einem beliebigen Zeichen, das nicht in der Klammer ist ~ Home-Verzeichnis des aktuellen Benutzers ~name Home-Verzeichnis des Benutzers name ~+ Aktuelles Verzeichnis ~- Vorheriges Verzeichnis 18 Arzu Sanli Ibrahim Canakci Befehlsformen Befehl Bedeutung Befehl & Ausführung von Befehl im Hintergrund Befehl1 ; Befehl2 Befehlsfolge, führt mehrere Befehle in einer Zeile aus (Befehl1 ; Befehl2) Subshell, behandelt Befehl1 und Befehl2 als Befehlsfolge Befehl1 | Befehl2 Pipe, verwendet die Ausgabe von Befehl1 als Eingabe für Befehl2 Befehl1 ‘Befehl2‘ Befehls-Substitution, verwendet die Ausgabe von Befehl2 als Argumente für Befehl1 Befehl1 && Befehl2 AND, führt zuerst Befehl1 und dann (wenn Befehl1 erfolgreich war) Befehl2 aus Befehl1 || Befehl2 OR, entweder Befehl1 ausführen oder Befehl2 (wenn Befehl1 nicht erfolgreich war) {Befehl1 ; Befehl2} Ausführung der Befehle in der momentanen Shell 19 Arzu Sanli Ibrahim Canakci Datenströme • 3 Standardkanäle: stdin, stdout und stderr Befehl > Datei Standard-Ausgabe von Befehl in Datei schreiben. Die Datei wird überschrieben, wenn sie schon bestand. Befehl >> Datei Standard-Ausgabe von Befehl an Datei anhängen. Die Datei wird erstellt, wenn sie noch nicht bestand. Befehl < Datei Standard-Eingabe für Befehl aus Datei lesen. Befehl << Delimiter Ein Here-Dokument: Der Befehl erhält den folgenden Abschnitt als StandardEingabe. Der Abschnitt endet, sobald der Delimiter am Zeilenanfang gefunden wird. Befehl1 | Befehl2 Die Standard-Ausgabe von Befehl1 wird an die Standard-Eingabe von Befehl2 übergeben. Befehl >&n Standard-Ausgabe von Befehl an den Dateideskriptor n übergeben. Befehl m>&n Der gleiche Vorgang, nur wird die Ausgabe, die normalerweise an den Dateideskriptor m geht, an den Dateideskriptor n übergeben. Befehl >&- Schließt die Standard-Ausgabe. Befehl <&n Standard-Eingabe für Befehl wird vom Dateideskriptor n übernommen. Befehl <&- Schließt die Standard-Eingabe. 20 Arzu Sanli Ibrahim Canakci Shell-Programmierung (2) • • • • • • Hallo Welt Eingabe / Ausgabe Parameterübergabe Kontrollstrukturen Funktionen Debugging 21 Arzu Sanli Ibrahim Canakci Hallo Welt • Datei “hallowelt“ 1. #!/bin/sh 2. #Kommentar 3. echo “Hallo Welt“ • Ausführen > chmod 755 hallowelt > ./hallowelt Hallo Welt 22 Arzu Sanli Ibrahim Canakci Eingabe / Ausgabe • Datei “lesen“ … echo “Bitte geben Sie ihren Namen an“; read answer echo “Ihre Antwort ist $answer“; • Ausführen > ./lesen Bitte geben Sie ihren Namen an Bruce Lee ;) Ihre Anwort ist Bruce Lee ;) 23 Arzu Sanli Ibrahim Canakci Parameterübergabe • Datei “parameter“ #!/bin/sh #Datei: parameter #Ausgabe der Parameter $0-$9 echo “$0: Anzahl der Parameter: $#“ echo “Parameter 0 -> $0“ … echo “Parameter 9 -> $9“ • Ausführen > ./parameter: Anzahl der Parameter: 9 Parameter 0 -> ./parameter Parameter 1 -> a … Parameter 9 -> i 24 Arzu Sanli Ibrahim Canakci Kontrollstrukturen • • • • • • IF-Anweisung CASE-Anweisung WHILE-Schleife UNTIL-Schleife FOR-Schleife SELECT-Schleife 25 Arzu Sanli Ibrahim Canakci IF-Anweisung if [ $# -gt 0 ] ; then Syntax echo “alles ok“ if Bedingung1; then else Anweisung1 echo “keine Parameter“ [elif Bedingung2; then fi Anweisung2] […] [else Anweisung3] fi 26 Arzu Sanli Ibrahim Canakci CASE-Anweisung Syntax case var in Muster a) Befehl1;; Muster b) Befehl2;; … esac case $1 in .) echo “Ausgabe .“;; a) echo “Ausgabe a“;; esac 27 Arzu Sanli Ibrahim Canakci WHILE-Schleife Syntax while Bedingung; do Anweisungen done while [ -n “$1“ ]; do echo “$1“ shift done 28 Arzu Sanli Ibrahim Canakci UNTIL-Schleife Syntax until Bedingung; do Anweisungen done until who | grep “root“; do sleep 2 echo “Mach ruhig weiter“ done echo “Vorsicht Admin ist anwesend!!!“ 29 Arzu Sanli Ibrahim Canakci FOR-Schleife Einfache for-Schleife Syntax for var[ in Liste ] do Befehle done for i in ich du er sie es; do echo $i done >> ich du er sie es 30 Arzu Sanli Ibrahim Canakci FOR-Schleife (2) for(( i=1;i<5;i++)); do echo $i done Spezielle for-Schleife Syntax for((expr1 ; expr2 ; expr3)); >> do 1 2 Anweisungen 3 done 4 31 Arzu Sanli Ibrahim Canakci SELECT-Schleife Syntax select var [in liste]; do PS3=“Bitte waehlen Sie im Menue:“ Anweisungen select i in wahl1 wahl2 ende; do done if[ “$i“ = “ende“ ]; then echo “Ende des Menues“ break #select wird beendet else echo “Gewaehltes Menuepunkt: $i“ fi done 32 Arzu Sanli Ibrahim Canakci Funktionen Syntax fname(){ kommandoliste; } Funktionsaufruf fname #!/bin/sh summe(){ tmp=0 tmp=$((tmp +$1 +$2)) echo $tmp } summe 2 3 33 Arzu Sanli Ibrahim Canakci Debugger 1. 2. 3. 4. 5. 6. #!/bin/bash –xv #Datei: fehler c=0 while [ ‘$c‘ –lt 10 ]; do let c=c+1 done #!/bin/bash –xv #Datei: fehler c=0 while [ ‘$c‘ –lt 10 ]; do let c=c+1 done + '[' '$c' -lt 10 ']' ./fehler: line 4: [: $c: integer expression expected 34 Debugger (2) #!/bin/bash -xv # Datei: fehler c=0 + c=0 while [ "$c" -lt 10 ]; do let c=c+1 done + '[' 0 -lt 10 ']' + let c=c+1 + '[' 1 -lt 10 ']' + let c=c+1 + '[' 2 -lt 10 ']' + let c=c+1 + '[' 3 -lt 10 ']' + let c=c+1 Arzu Sanli Ibrahim Canakci + '[' 4 -lt 10 ']' + let c=c+1 + '[' 5 -lt 10 ']' + let c=c+1 + '[' 6 -lt 10 ']' + let c=c+1 + '[' 7 -lt 10 ']' + let c=c+1 + '[' 8 -lt 10 ']' + let c=c+1 + '[' 9 -lt 10 ']' + let c=c+1 + '[' 10 -lt 10 ']' 35 Beispielprogramm Arzu Sanli Ibrahim Canakci 36 Arzu Sanli Ibrahim Canakci Schlusswort Da für jeden Schritt in einem Skript ein neuer Prozess gestartet wird, kostet das eine Menge Systemzeit. Für komplexe, zeitkritische oder langwierige Aufgaben sollte man eher zu Programmiersprachen wie Perl, Pyton oder zu C / C++ greifen. 37 Arzu Sanli Ibrahim Canakci Quellen • Literatur ▫ Shell Programmierung Für Unix und Linux 3.Auflage (Rainer Krienke) • Internet ▫ http://www.odise.de/projekte/eskeidbl/pdf ▫ http://www.linux-services.org/shell/ ▫ http://de.wikibooks.org/wiki/LinuxKompendium:_Shellprogrammierung ▫ http://www.schatenseite.de/unixshell.html?&L=0/ shell.pdf 38 Danke für die Aufmerksamkeit! Arzu Sanli Ibrahim Canakci