Vorlesung 4: Shell-Scripting (Teil 1)

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

Bash-Skripting Linux-Kurs der Unix-AG

Shell-Scripting Linux-Kurs der Unix-AG

Shell-Scripting Linux-Kurs der Unix-AG

Shell-Scripting Linux-Kurs der Unix-AG

Shell-Scripting Linux-Kurs der Unix-AG

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

Bash-Scripting Linux-Kurs der Unix-AG

Übersicht Shell-Scripten

Vorbemerkung. Allgemeines zu Shell Scripts. Aufruf. Einfaches Beispiel

Übersicht PERL. !!!! Wichtig: Nach dem Befehl einem Strichpunkt setzen!!!!

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

Programming 101. Carl Herrmann IPMB & DKFZ

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

Einführung Datentypen Verzweigung Schleifen. Java Crashkurs. Kim-Manuel Klein May 4, 2015

Informatik I Übung, Woche 40

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

Funktionen in JavaScript

GI Vektoren

Arzu Sanli Ibrahim Canakci

PROCESSING EINE ZUSAMMENFASSUNG. Created by Michael Kirsch & Beat Rossmy

Vorlesung Unix-Praktikum

Funktionen in JavaScript

Linux und Shell-Programmierung Teil 5

Technische Praxis der Computersysteme 1

Vorkurs Informatik WiSe 16/17

2 Eine einfache Programmiersprache

2 Eine einfache Programmiersprache. Variablen. Operationen Zuweisung. Variablen

Schachtelung der 2. Variante (Bedingungs-Kaskade): if (B1) A1 else if (B2) A2 else if (B3) A3 else if (B4) A4 else A

05 For-Schleifen. For-Schleifen 1/7 Was ist eine Schleife?

2 Eine einfache Programmiersprache

Computer & GNU/Linux Einführung Teil 4

Einführung Unix Shell

Probeklausur Name: (c)

Einführung in den Einsatz von Objekt-Orientierung mit C++ I

12 == 12 true 12 == 21 false 4 === 7 true 4 === "vier" false 4 === 4.0 false 12!= 13 true 12!== 12 false 12!== 12.0 true. 1 < 3 true 3 < 1 false

RO-Tutorien 3 / 6 / 12

Schleifenanweisungen

Übung: Entwickeln eines Shell-Skripts

Informatik I Übung, Woche 40

Vorlesung Unix-Praktikum

Systemverwaltung mittels Skripts

1 Aufgaben 1.1 Objektorientiert: ("extended-hamster") Sammel-Hamster

Arrays. Theorieteil. Inhaltsverzeichnis. Begriffe. Programmieren mit Java Modul 3. 1 Modulübersicht 3

Vorlesung Skriptsprachen Duale Hochschule Stuttgart Sommersemester Dipl.-Ing. (FH) Volker Schepper

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

Modul Entscheidungsunterstützung in der Logistik. Einführung in die Programmierung mit C++ Übung 2

javascript Coding-Guidelines 2. Ausgabe Februar 2015 Der Guideline beschreibt den verwendeten Coding-Stil von javascript als eigene Richtline.

Windows PowerShell. CmdLets. PipeLine / Filter. Variablen / Operatoren. Schleifen / Prüfmethoden. Funktionen / Skripte. Allgegenwärtige Parameter

hue12 January 24, 2017

AuD-Tafelübung T-B5b

Grundlagen der Programmierung

01 Einführung in PHP. Einführung in PHP 1/13 PHP in Aktion

Programmieren in C. Funktionen mit Zeigern und Adressen. Prof. Dr. Nikolaus Wulff

2 Eine einfache Programmiersprache

Angewandte Mathematik und Programmierung

Grundlagen der Informatik 6. Arrays I

Übersicht. Einführung in Perl Datenstrukturen I. Datentypen Übersicht (1) Kernbegriffe. Kernbegriffe. Einführung der Datentypen.

Einführung Datentypen Verzweigung Schleifen Funktionen Dynamische Datenstrukturen. Java Crashkurs. Kim-Manuel Klein

2 Eine einfache Programmiersprache

Programmieren I. Kapitel 5. Kontrollfluss

Erste Java-Programme (Scopes und Rekursion)

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

FACHHOCHSCHULE AUGSBURG Hochschule für Technik, Wirtschaft und Gestaltung

Übungszettel 2a - Python

RO-Tutorien 15 und 16

Grundlagen. Wie sind PHP-Dateien aufgebaut?

4 Kontrollfluss-Diagramme

Programmiersprachen Einführung in C

Arbeiten mit JavaKara

JAVA-Datentypen und deren Wertebereich

Informatik I - Einstiegskurs

Strings (Zeichenketten)

Informatik I - Übung 2 Programmieren in Eclipse

Herzlich willkommen!

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

Funktionen in Matlab. Nutzerdefinierte Funktionen können in.m-datei gespeichert werden

Python für Linguisten

Rückgabewerte von Methoden

Ein Array ist eine Liste mit Einträgen, fast wie eine Einkaufsliste. Man kann darin also mehr als einen Eintrag in eine einzige Variable speichern.

Algorithmik und Programmieren

einlesen n > 0? Ausgabe Negative Zahl

Organisatorisches. Folien (u.a.) gibt's auf der Lva-Homepage zum Download

ShellScripting : Shell Scripte

Ausgabe:

F Zeiger, Felder und Strukturen in C

Einführung in die Programmierung II. 1 Einleitung/Übersicht

Martin Unold INFORMATIK. Geoinformatik und Vermessung

Übungen zur Vorlesung Wissenschaftliches Rechnen I

Transkript:

Vorlesung 4: Shell-Scripting (Teil 1) Shell-Beispiele: Bash Dash Fish Z-Shell (zsh) Korn-Shell (ksh) Mksh Weitestverbreitete Shell bei Linux- Systemen Standard-Shell unter Ubuntu Shell mit der expliziten Zitzung Benutzerfreundlichkeit Mächtige Shell mit einem sehr ausgereiften Command-Editor Von David Korn an den AT&T Bell Laboratories entwickelter Kommanzeileninterpreter wie auch die Beschreibung der Scriptsprache, welche durch diesen Interpreter implementiert wird. Die Sprachbeschreibung selbst ist gemeinfrei, nicht jech jede Implementierung. Der originale Quellcode der ksh93 ist seit 2000 ebenfalls gemeinfrei. Die KornShell (in der Version von 1988) bildete die Grundlage für die POSIX-Shell- Spezikation und erfüllt den POSIX2-Standard. Sie ist vollständig abwärtskompatibel mit der Bourne Shell (sh bzw. bsh) und übernimmt viele Neürungen der C Shell (csh) Direkte Nachfolger der Korn Shell /bin/ksh, ist aber nicht verbunden mit der AT&T Korn Shell und deren Programmierern; vielmehr ersetzt es die Public Domain Korn Shell pdksh, und implementiert gleichzeitig die Korn

Shell programming language, wie sie auch als Untermenge in der Bash vorhanden ist. Gleichzeitig enthält seit Ubuntu 12.10 das mksh-paket die Legacy Korn Shell lksh; lksh ist ein schlanker Kommaninterpreter, mit der Intention zum Ablauf von Shell-Skripten nach dem ksh- Standard. lksh und mksh unterliegen in keinem Fall der ShellShock- Problematik. Die mksh ist an Stelle der Bash im Android-System vertreten, und nach Aussagen der Firma Google damit häuger in UNIX-artigen Systemen vertreten als die Bash Bei vielen Linux-Distributionen ist die Standard-Shell die bash. Um ein Script script.sh zu starten muss man es mit chmod +x script.sh ausführbar machen und./script in das Terminal eingeben. Um ein Script script.sh mit einer bestimmten Shell zu starten muss man <shell> script.sh eingeben. bash script.sh Aber am besten ist es am Anfang den Pfad zu der Shell zu schreiben. Das sagt dem System mit welcher Shell das Script ausgefürt wird. Aber davor muss man #! schreiben. #Das Script wird mit bash gestartet Kommentare: #<text> #Das ist ein Script Anmerkung: #! ist kein Kommentar Ein- und Ausgabe: Ausgabe: echo <parameter> echo "Hello World" #Gibt "Hello World" aus

Der Zeilenumbruch erfolgt automatisch Die Ausgabe kann auch farbig gemacht werden: echo -e <Steuerzeichen><parameter><Steuerzeichen> echo -e "\033[32mHello World\033[0m" #Gibt "Hello World" in grün aus Farben: \033[0m \033[1m \033[4m \033[5m \033[7m \033[30m \033[31m \033[32m \033[33m \033[34m \033[35m \033[36m \033[37m \033[40m \033[41m \033[42m \033[43m \033[44m \033[45m \033[46m \033[47m alle Attribute zurücksetzen Fettschrift Unterstreichen Blinken inverse Darstellung Schriftfarbe schwarz Schriftfarbe rot Schriftfarbe grün Schriftfarbe gelb Schriftfarbe blau Schriftfarbe magenta Schriftfarbe türkis Schriftfarbe weiß Hintergrund schwarz Hintergrund rot Hintergrund grün Hintergrund gelb Hintergrund blau Hintergrund magenta Hintergrund türkis Hintergrund weiß Man kann etwas in eine Datei ausgeben/schreiben: echo <parameter> > <datei> echo "Hello World" > hello.txt #Übersreibt alles in Datei hello.txt mit "Hello World"

echo <parameter> >> <datei> echo "My name is Alex" >> hello.txt #Fügt "My name is Alex" am Ende der Datei hinzu Wenn man eine Variable ausgeben will, dann muss man ein '$'-Zeichen davor setzen echo <text>$<var><text> echo "Wert von i ist $i" #Gibt den text "Wert von i ist " und den Inhalt der Variable i aus Anmerkung: Wenn man ein '$'-Zeichen ausgeben möchte muss man \$ schreiben. Es gibt folgende Ausdrücke: \a Gibt einen Ton aus \n Neü Zeile \\ Gibt \ aus \" Gibt " aus \' Gibt ' aus \ Gibt ein Leerzeichen aus \c Verhindert den Zeilenumbruch \$ Gibt $ aus Anmerkung: Bei \n, \a und \c muss man echo -e schreiben Den Zeilenumbruch kann man auch mit -n verhindern. Zum echo -n "Hello World" Als Ausgabe kann man auch printf nutzen: printf "<text>%<datentypzeichen><text>" $<variablenname> i=5 printf "Wert von i ist %d\n" $i #Gibt "Wert von i ist 5" aus Anmerkung: Die Zeichen \n, \a und andere. werden bei printf ganz normal akzeptiert. Aber es gibt weder \c oder \n, da der Zeichenumbruch nicht automatisch erfolgt. Wichtige Datentypenzeichen: %d Integer (Ganze Zahl) %f Float (Gleitkommazahle) %c Char (Zeichen) %s String (Zeichenkette)

Eingabe: read <variable> read var #Eingabe von Variable var Man kann die Eingabe mit einem Text zusammensetzen: read -p <text> <variable> read -p "Eingabe: " i #Gibt "Eingabe:" aus und lässt die Variable i eingeben Variablen: Um eine Variable zu deklarieren muss man gleichzeitig auch einen Wert zuweisen. Dass nennt sich Initialisierung i=0 #Variable i wird deklariert und mit 0 initialisiert Um aud den Wert von der Variable zugreifen zu können muss man ein '$'- Zeichen davor schreiben. $i #Wert von Variable i Um arithmetische Zuweisungen auszuführen muss man let davor schreiben let i=$i+1 #Variable i wird um 1 erhöht Mann kann auch inkrementieren oder dekrementieren, aber dann muss der Ausdruck in ppelte Klammern gesetzt werden. ((i++)) Um 2 Zeilen zu konkatenieren muss man die Variablen hintereinanderschreiben i="hallo " #in der Zeile ist ein Leerzeicehn enthalten k="welt" i=$i$k echo "$i" #Gibt "Hallo Welt" aus i="hallo" #in der Zeile ist kein Leerzeichen enthalten k="welt" i=$i\ $k #es wird ein Leerzeichen zwischen den Variablen gesetzt echo "$i" #Gibt "Hallo Welt" aus Arrays: Ein Array ist eine endliche Folge von Werten, die in eine Variable gespeichert werden. So sieht ein Array aus: <array>=(<variable 1> <variable 2>... <variable n>) arr=(one two three four ve) #Array arr hat 5 Elemente Jedes Element hat ein Index, d.h. die Nummer der Reihenfolge.

Das erste Element hat den Index 0, das zweite den Index 1 usw. Um das ganze Array auszugeben benutzt man ${arr[*]} * ist der Alllter, so werden alle Elemente ausgegeben. Man kann ein bestimmtes Element verändern, indem man darauf durch den Index zugreift. arr=(1 2 3 5 5 6) echo ${arr[*]} arr[3]=4 echo ${arr[*]} #Die Ausgabe ist folgendes: #1 2 3 5 5 6 #1 2 3 4 5 6 Um alle Indices des Arrays auszugeben benutzt man ${!arr[*]} arr=(1 2 3 4 5) echo ${!arr[*]} #Ausgabe: 0 1 2 3 4 Um die Länge des Array auszugeben, benutzt man ${#arr[*]} arr=(1 2 3 4 5) echo ${#arr[*]} #Ausgabe: 5 Um die Länge eines Elements auszugeben, benutzt man ${#arr[<index>]} arr=(hallo ich bin Alex) echo ${#arr[1]} #Ausgabe: 3

if--anweisungen: Die if--anweisungen sind Fallunterscheidungen. Es wird überprüft ob eine Bedingung stimmt und dann die dazugehörigen Schritte ausgeführt. Die if--anweisung sieht wie folgt aus: if [ <Bedingung> ] <Code> <Code> Zuerst müssen wir noch die Vergleichsoperatoren anschauen: -eq gleich (equal) -ne -gt -lt -ge -le ungleich (not equal) größer (greater than) kleiner (lesser than) größer oder gleich (greater or equal) kleiner oder gleich (lesser or equal) -a und (and) -o oder (or)! nicht (not) Mann kann auch normale Vergleichsoperatoren benutzen, aber dann muss man den Ausdruck in Doppelklammer setzen. (($i>0))

Bei den Zeichenketten sind die Vergleichsoperatoren anders: <String 1> = <String 2> String 1 gleich String 2 <String 1>!= <String 2> String 1 ungleich String 2 <String> Die Länge ungleich 0 -n <String> Die Länge ungleich 0 -z <String> Die Länge gleich 0 read -p "Eingabe: " i #Eingabe von i if (($i<=0)) #Wenn i größer/gleich 0 ist echo "$i ist größer oder gleich 0" #Ausgabe: "i ist größer oder #gleich 0" echo "$i ist kleiner 0" #Ausgabe: "i ist kleiner 0" #if--ende Man muss nicht unbedingt benutzen, wenn man das nicht braucht. Aber, wenn man mehrere Fälle haben will, kann man den Befehl elif benutzen. read -p "Eingabe: " i #Eingabe von i if [ $i -gt 0 ] #Wenn i größer/gleich 0 ist echo "$i ist größer 0" #Ausgabe: "i ist grösser 0" elif [ $i -eq 0 ] #Wenn i gleich 0 ist echo "$i ist gleich 0" #Ausgabe: "i ist gleich 0" echo "$i ist kleiner 0" #Ausgabe: "i ist kleiner 0" #if--ende Mann koennte auch so was wie if (($i>0)) schreiben. Und das hätte funktioniert.

read -p "Eingabe von i: " i #Eingabe von i read -p "Eingabe von k: " k #Eingabe von k if [ $i -eq 0 -a $k -eq 0 ] #Wenn i=0 und k=0 echo "i und k sind 0" #Ausgabe: "i und k sind 0" elif [! $i -eq 0 -a! $k -eq 0 ] #Wenn nicht i=0 und nicht k=0 echo "i und k sind nicht 0" #Ausgabe: "i und k sind nicht 0" elif [! $i -eq 0 -a $k -eq 0 ] #Wenn nicht i=0 und k=0 echo "k ist 0" #Ausgabe: "k ist 0" echo "i ist 0" #Ausgabe: "i ist 0" #if--ende read -p "Eingabe von str: " str #Eingabe von str if [ $str ] #Wenn die Länge von str ungleich 0 echo $str #Ausgabe von str echo 0 #Ausgabe: 0 #if--ende read -p "Eingabe von str1: " str1 read -p "Eingabe von str2: " str2 if [ $str1 = $str2 ] echo "str1 und str2 sind gleich" echo "str1 und str2 sind ungleich" Schleifen: #Eingabe von str1 #Eingabe von str2 #Wenn str1 gleich str2 #Ausgabe #Ausgabe #if--ende

Eine Schleife ist eine Befehlsfolge, die mehrmals ausgeführt wird. Ein Schleifendurchlauf nennt man Iteration. In bash gibt es 2 Schleifenarten: for und while. Leider gibt es kein while. for-schleife: for-schleife sieht wie folgt aus: for ((<var>=<var/wert>; <var><vergleich><var/wert>; <varveränderung>)) <Code> ne for ((i=1; $i <= 5; i++)) echo "Iteration $i" ne #Schleifenbedingung #Scheifenanfang #Ausgabe #Schleifenende #Am Anfang ist i=1, bei jedem Schleifendurchlauf wird i um 1 erhöht #(i++) = i=$i+1. Die Schleife laüft bis i<=5 ist. Dann höer sie auf. #Ausgabe: # Iteration 1 # Iteration 2 # Iteration 3 # Iteration 4 # Iteration 5 Anmerkung: Die üblichen Vergleichsoperatoren, Inkrementierung (++) und Dekrementierung (--) sind in der bash nur in for-schleifen erlaubt. Die for-schleifen können auch gut mit Arrays arbeiten for <var> in <array> <Code> ne

array=(one two three four ve) #Array aus 5 Elementen echo "Array size: ${#array[*]}" #Ausgabe von Arraylänge echo "Array items:" #Ausgabe for item in ${array[*]} #für jede Variable "item" in Array printf "%s\n" $item #Ausgabe von Element (item) ne echo "Array indexes:" #Ausgabe for index in ${!array[*]} #für jedes "index" in Arrayindicies printf "%d\n" $index #Ausgabe von dem Index ne echo "Array items and indexes:" #Ausgabe for index in ${!array[*]} #für jedes "index" printf "%d: %s\n" $index ${array[$index]} #Ausgabe von Indicies und Elementen ne while-schleife: Die while-schleife sieht wie folgt aus: while [ Bedingung ] <Code> ne i=0 #i=0 while [ $i -lt 5 ] #Wird wiederholt, wenn i<5 ist #Schleifenanfang echo $i #Ausgabe von i let i=$i+1 #i wird um 1 erhöht ne #Schleifenende

Funktionen: Funktion ist eine Sammlung von Befehlen, die ein Ergebniss zurückliefern kann. Die Funktionen in bash haben folgende Form: function <funktionsname>(<parameter 1>,..., <parameter n>) { <Code> } function add() { let sum=$1+$2 echo $sum } read -p "Wert 1: " a read -p "Wert 2: " b add a b #Funktion add #sum=parameter1+parameter2 (a+b) #Ausgabe von sum #Eingabe von a #Eingabe von b #Funktionsaufruf mit parameter a und b Mann kann auch ein Wert zurückgeben, aber der kann 256 nicht überschreiten function add() #Funktion add { let sum=$1+$2 #sum=parameter1+parameter2 (a+b) return $sum #Gib Variable sum zurück } read -p "Wert 1: " a #Eingabe von a read -p "Wert 2: " b #Eingabe von b add a b #Funktionsaufruf mit parameter a und b echo $? #Ausgabe von letzter return Anweisung Wenn man größere Werte eingibt, kommen komische Werte raus. return ist besser für exit-code zu verwenden (Also geklappt oder nicht):

function mastermind() #Funktion mastermind { if [ $1 -eq 5 ] #Wenn parameter1=5 (number=5) return 1 #Gebe 1 zurück return 0 #Gebe 0 zurück #if--ende } read -p "Eingabe: " number #Eingabe von number mastermind $number #Funktionsaufruf mit parameter number if [ $? -eq 1 ] #Wenn return Wert ist 1 echo "Gewonnen" #Ausgabe "Gewonnen" echo "Verloren" #Ausgabe "Verloren" #if--ende