Irina Deines Alexander Grinberg - HSRMweber/sysprog/proj08/shell_prog.pdf · 2008. 7. 7. ·...

62
Shell-Programmierung Irina Deines Alexander Grinberg

Transcript of Irina Deines Alexander Grinberg - HSRMweber/sysprog/proj08/shell_prog.pdf · 2008. 7. 7. ·...

Page 1: Irina Deines Alexander Grinberg - HSRMweber/sysprog/proj08/shell_prog.pdf · 2008. 7. 7. · Alexander Grinberg Irina Deines 24. Juni 2008 5 Shells im Vergleich Anfang der 70er hat

Shell-Programmierung

Irina Deines

Alexander Grinberg

Page 2: Irina Deines Alexander Grinberg - HSRMweber/sysprog/proj08/shell_prog.pdf · 2008. 7. 7. · Alexander Grinberg Irina Deines 24. Juni 2008 5 Shells im Vergleich Anfang der 70er hat

Alexander GrinbergIrina Deines

24. Juni 2008 2

AgendaEinleitung

Was ist eine Shell?Shells im VergleichWofür Shellprogrammierung

Shellprogrammierung MetazeichenDatenströmeBefehlsformenQuotingVariablenArithmetik

Page 3: Irina Deines Alexander Grinberg - HSRMweber/sysprog/proj08/shell_prog.pdf · 2008. 7. 7. · Alexander Grinberg Irina Deines 24. Juni 2008 5 Shells im Vergleich Anfang der 70er hat

Alexander GrinbergIrina Deines

24. Juni 2008 3

AgendaProgrammablaufkontrolle

KontrollstrukturenSchleifenFunktionen

Eingabe und AusgabeAliasUnix-Tools

awkbc und dc

Quellen

Page 4: Irina Deines Alexander Grinberg - HSRMweber/sysprog/proj08/shell_prog.pdf · 2008. 7. 7. · Alexander Grinberg Irina Deines 24. Juni 2008 5 Shells im Vergleich Anfang der 70er hat

Alexander GrinbergIrina Deines

24. Juni 2008 4

Was ist eine Shell?

bildet die Schnittstelle zwischen dem Kernel und dem Benutzer

sorgt für eine Kommunikation mit dem System interpretiert Benutzerbefehle –> Kommandointerpreter

Einsatzgebiete einer Shell:Systemadministrationbei alten Rechnern (ohne grafische Benutzeroberfläche) ‏

Page 5: Irina Deines Alexander Grinberg - HSRMweber/sysprog/proj08/shell_prog.pdf · 2008. 7. 7. · Alexander Grinberg Irina Deines 24. Juni 2008 5 Shells im Vergleich Anfang der 70er hat

Alexander GrinbergIrina Deines

24. Juni 2008 5

Shells im Vergleich

Anfang der 70er hat das erste UNIX-System die Thompson-Shell

wird von der Bourne-Shell 1978 als Standardshell abgelöstparallel dazu gibt es Entwicklungen anderer Shells

Seit 1987 gibt es eine Weiterentwicklung der Bourne-Shell: Bourne-Again-Shell (Bash)!!! Unterteilung der Shells in 2 Familien

Bourne-Familie: sh, ksh, bash und zshC-Shell-Familie: csh, tcsh

Page 6: Irina Deines Alexander Grinberg - HSRMweber/sysprog/proj08/shell_prog.pdf · 2008. 7. 7. · Alexander Grinberg Irina Deines 24. Juni 2008 5 Shells im Vergleich Anfang der 70er hat

Alexander GrinbergIrina Deines

24. Juni 2008 6

Shells im Vergleich Leistungsmerkmal ksh bash tcshNamensexpansion x x xNamensvervollständigung x x xEin- und Ausgabenumlenkung x x xasynchrone Prozesse x x xJobkontrolle x x xHistory x x xKommandozeileneditor x x xTippfehlerkorrektur xLogin-Dateien x x xLogout-Dateien xAlias x x xShell-Funktionen x xarithmetische Operationen x x xFeldvariablen x xSignalbehandlung x x x

Page 7: Irina Deines Alexander Grinberg - HSRMweber/sysprog/proj08/shell_prog.pdf · 2008. 7. 7. · Alexander Grinberg Irina Deines 24. Juni 2008 5 Shells im Vergleich Anfang der 70er hat

Alexander GrinbergIrina Deines

24. Juni 2008 7

Wofür Shellprogrammierung?

1. wiederkehrende Kommandos zusammenfassenz.B. Zusammenfassen von Kommandos

2. Programme zur Erledigung von Aufgaben schreibenz.B. Skript, das das E-Mail-Fach auf neuen Eingang überprüft

Page 8: Irina Deines Alexander Grinberg - HSRMweber/sysprog/proj08/shell_prog.pdf · 2008. 7. 7. · Alexander Grinberg Irina Deines 24. Juni 2008 5 Shells im Vergleich Anfang der 70er hat

Alexander GrinbergIrina Deines

24. Juni 2008 8

Bash-Programmierung

Shellskripte sind ausführbare Dateiensie werden nicht kompiliert, sondern interpretiert

die erste Zeile weist auf die interpretierende Shell hin #!/bin/bash, #!/bin/sh etc.

Kommentare beginnen mit # eine Zeile wird ab der Raute nicht von der Shell interpretiert

Page 9: Irina Deines Alexander Grinberg - HSRMweber/sysprog/proj08/shell_prog.pdf · 2008. 7. 7. · Alexander Grinberg Irina Deines 24. Juni 2008 5 Shells im Vergleich Anfang der 70er hat

Alexander GrinbergIrina Deines

24. Juni 2008 9

Metazeichen - Dateinamenexpansion

Interpretation von Metazeichen erfolgt vor der Ausführung des Befehls. stößt die Shell auf *, ? oder [] ([abc], [a-q], [!f-h]) interpretiert sie die Zeichenkette als Muster für Dateinamen

echo *.txt

ls file?.dat

echo file[0-9].txt

Page 10: Irina Deines Alexander Grinberg - HSRMweber/sysprog/proj08/shell_prog.pdf · 2008. 7. 7. · Alexander Grinberg Irina Deines 24. Juni 2008 5 Shells im Vergleich Anfang der 70er hat

Alexander GrinbergIrina Deines

24. Juni 2008 10

Metazeichen - Tildeexpansion

mit ~ kommt der Benutzer zum Homeverzeichnis~name -> Homeverzeichnis des Benutzers name~+ -> aktuelles Verzeichnis ~- -> vorheriges Verzeichnis

Backslash hebt die Sonderbedeutung eines Metazeichens auf

Page 11: Irina Deines Alexander Grinberg - HSRMweber/sysprog/proj08/shell_prog.pdf · 2008. 7. 7. · Alexander Grinberg Irina Deines 24. Juni 2008 5 Shells im Vergleich Anfang der 70er hat

Alexander GrinbergIrina Deines

24. Juni 2008 11

Datenströme3 Kanäle: stdin (Deskriptor 0), stdout (Deskriptor 1) und stderr (Deskriptor 2) ‏

Befehl > Datei Umlenkung von stdout von Befehl in DateiBefehl 2> Datei Umlenkung von stderr von Befehl in Datei

Befehl >&n

Befehl m>&n

Befehl > Datei 2>&1

Befehl > Datei1 2> Datei2 stdout in Datei1 und stderr in Datei2Befehl >&- schließt stdoutBefehl >> Datei stdout von Befehl am Ende von Datei anfügeBefehl 2>> Datei stderr von Befehl am Ende von Datei anfüge

stdout von Befehl wird an Dateideskriptor n übergebenAusgabe von Befehl, die an Deskriptor m geht, wird an Deskriptor n übergeben lenkt stdout und stderr von Befehl in Datei um

Page 12: Irina Deines Alexander Grinberg - HSRMweber/sysprog/proj08/shell_prog.pdf · 2008. 7. 7. · Alexander Grinberg Irina Deines 24. Juni 2008 5 Shells im Vergleich Anfang der 70er hat

Alexander GrinbergIrina Deines

24. Juni 2008 12

Datenströme

Befehl < Datei

Befehl <&-

Befehl << Wort

Befehl | Datei

stdin für Befehl wird aus Datei gelesen

Befehl <&n stdin für Befehl wird von Dateideskriptor n übernommen

Befehl m<&n Eingabe, die von Dateideskriptor m kommt, wird aus Dateideskriptor n übernommenschließt stdinHere-Document: stdin für Befehl ist Text bis Wortstdout von Befehl1 wird an stdin von Befehl 2 übergeben

Page 13: Irina Deines Alexander Grinberg - HSRMweber/sysprog/proj08/shell_prog.pdf · 2008. 7. 7. · Alexander Grinberg Irina Deines 24. Juni 2008 5 Shells im Vergleich Anfang der 70er hat

Alexander GrinbergIrina Deines

24. Juni 2008 13

Befehlsformen

Befehl & Befehl wird im Hintergrund ausgeführtBefehl1 ; Befehl2 Befehle werden nacheinander ausgeführt

(Befehl1; Befehl2)

`Befehl`

Befehl1 && Befehl2

Befehl1 || Befehl2

Befehle werden gruppiert in einer Subshell ausgeführt und erzeugen eine gemeinsame AusgabeKommandosubstitution: führt Befehl aus und ersetzt `Befehl` durch stdout von BefehlBefehl2 wird nur bei Erfolg von Befehl1 ausgeführt (AND)Befehl2 wird nur bei Nicht-Erfolg von Befehl1 ausgeführt (OR)

Page 14: Irina Deines Alexander Grinberg - HSRMweber/sysprog/proj08/shell_prog.pdf · 2008. 7. 7. · Alexander Grinberg Irina Deines 24. Juni 2008 5 Shells im Vergleich Anfang der 70er hat

Alexander GrinbergIrina Deines

24. Juni 2008 14

Quoting

Möglichkeit, Sonderbedeutung von Metazeichen und Befehlen zuzulassen bzw. aufzuheben2 Möglichkeiten:

1. Backslash vor das Metazeichen2. Zeichenkette in Apostrophe (') oder Anführungszeichen ('') setzen

'' lassen die Interpretation von $, \, und ` (Backsticks) zualle Metazeichen in ' verlieren ihre Spezialbedeutung

Page 15: Irina Deines Alexander Grinberg - HSRMweber/sysprog/proj08/shell_prog.pdf · 2008. 7. 7. · Alexander Grinberg Irina Deines 24. Juni 2008 5 Shells im Vergleich Anfang der 70er hat

Alexander GrinbergIrina Deines

24. Juni 2008 15

Quoting - Beispiele

user$ echo "`pwd`"/local/useruser$ echo "pwd"pwduser$ echo '* ACHTUNG *'* ACHTUNG *user$ dir="$PWD/dir"user$ echo "dir:'$dir'"dir:'/autofs/student/idein001/dir'user$ var=17user$ echo "Variable:\$var Wert:$var"Variable:$var Wert:17user$ ls 'ab* $var'

Page 16: Irina Deines Alexander Grinberg - HSRMweber/sysprog/proj08/shell_prog.pdf · 2008. 7. 7. · Alexander Grinberg Irina Deines 24. Juni 2008 5 Shells im Vergleich Anfang der 70er hat

Alexander GrinbergIrina Deines

24. Juni 2008 16

Variablen

müssen nicht deklariert werden per default ist der Variablentyp eine Zeichenkette

Variablennamen können aus Buchstaben, Ziffern und Unterstrichen bestehen, dürfen nicht mit einer Zahl beginnen Inhalt einer Variablen: $Variablenname

Ersetzung der Variablen durch ihren Inhalt erfolgt vor der Ausführung eines Befehls

Page 17: Irina Deines Alexander Grinberg - HSRMweber/sysprog/proj08/shell_prog.pdf · 2008. 7. 7. · Alexander Grinberg Irina Deines 24. Juni 2008 5 Shells im Vergleich Anfang der 70er hat

Alexander GrinbergIrina Deines

24. Juni 2008 17

Variablen - Definition

globale Variablen = Umgebungsvariablenwerden nach dem Start eines Kommandos oder einer Shell weitergegeben

Ausdruck Bedeutung

Zeigt alle globalen Variablen an.

Zeigt sowohl globale als auch lokale Variablen an.

a=3

a hat den Wert 3 und ist lokal.declare a=3

let a=3declare -x a=3

a hat den Wert 3 und ist global.export a=3

export a a wird zu einer globalen Variable.local a=3 Definiert a als lokal. Nur in Shell-Funktionen möglich.exportprintenv

settypeset

unset a Variable a wird gelöscht.

Page 18: Irina Deines Alexander Grinberg - HSRMweber/sysprog/proj08/shell_prog.pdf · 2008. 7. 7. · Alexander Grinberg Irina Deines 24. Juni 2008 5 Shells im Vergleich Anfang der 70er hat

Alexander GrinbergIrina Deines

24. Juni 2008 18

Variablen - Definition

bei declare können Variablen Attribute mitgegeben werden

mit - Attribut setzen, mit + Attribut löschen:a Feldattributi Integer-Attributr Leseattributx export-Attribut

mit -p kann man sich alle Attribute anzeigen lassen

Page 19: Irina Deines Alexander Grinberg - HSRMweber/sysprog/proj08/shell_prog.pdf · 2008. 7. 7. · Alexander Grinberg Irina Deines 24. Juni 2008 5 Shells im Vergleich Anfang der 70er hat

Alexander GrinbergIrina Deines

24. Juni 2008 19

Variablen - Beispieleuser$ cat new.shdeclare -r r=77echo $rr=12echo "$r"user$ bash new.sh77new.sh: line 3: r: readonly variable77

user$ cat new.shdeclare -i -r help=123declare -p helpuser$ bash new.shdeclare -ir help="123"

user$ declare -i a=3user$ b=3user$ a=a+buser$ b=a+buser$ echo $a " " $b6 a+b

Page 20: Irina Deines Alexander Grinberg - HSRMweber/sysprog/proj08/shell_prog.pdf · 2008. 7. 7. · Alexander Grinberg Irina Deines 24. Juni 2008 5 Shells im Vergleich Anfang der 70er hat

Alexander GrinbergIrina Deines

24. Juni 2008 20

Vordefinierte VariablenVariable Bedeutung

$*

$@

$# Anzahl der Aufrufparameter.$?

$PWD aktuelles Verzeichnis$OLDPWD vorheriges Verzeichnis$PATH Pfad, in dem nach ausführbaren Kommandos gesucht wird.

$n Aufrufparameter mit der Nummer n; 0 <= n <= 9Alle Aufrufparameter in einem String.Alle Aufrufparameter, wobei jeder ein separater String ist.

Rückgabewert des letzten Kommandos.

mit shift [n] die Werte der Aufrufparameter ''nach links'' verschieben

nach dem 9. Parameter: ${10}, ...

Page 21: Irina Deines Alexander Grinberg - HSRMweber/sysprog/proj08/shell_prog.pdf · 2008. 7. 7. · Alexander Grinberg Irina Deines 24. Juni 2008 5 Shells im Vergleich Anfang der 70er hat

Alexander GrinbergIrina Deines

24. Juni 2008 21

Globale Variablenbeim Start eines Programms wird eine Subshell gestartet

Nachteil: Umgebungsvariablen in beiden Shells sind unabhängig voneinanderLösung: Aufruf des Programms mit Punkt und Leerzeichen vor Programmname

user$ cat new.shPATH=$PATH":"`pwd`user$ echo $PATH/usr/java/latest/bin:/usr/java/latest/binuser$ bash new.shuser$ echo $PATH/usr/java/latest/bin:/usr/java/latest/binuser$ . new.shuser$ echo $PATH/usr/java/latest/bin:/usr/java/latest/bin:/user/ShellProg

Page 22: Irina Deines Alexander Grinberg - HSRMweber/sysprog/proj08/shell_prog.pdf · 2008. 7. 7. · Alexander Grinberg Irina Deines 24. Juni 2008 5 Shells im Vergleich Anfang der 70er hat

Alexander GrinbergIrina Deines

24. Juni 2008 22

Variablen-Substitution

Ausdruck Bedeutung

${Variable}

${Variable:-Wert} Falls Variable belegt: deren Inhalt, sonst Wert

${Variable:=Wert}

${Variable:?Wert}

${Variable:+Wert} Falls Variable belegt ist, wird deren Wert ausgegeben.

${#Variable}

Inhalt von Variable. Die Klammern müssen nur angegeben werden, wenn nach Variable eine Zahl, ein Buchstabe oder ein Unterstrich folgen.

Falls Variable belegt: deren Inhalt, sonst: Rückgabe Wert und Variable bekommt Wert zugewiesenFalls Variable belegt ist: deren Inhalt, sonst: Wert ausgegeben und die Shell beendet.

Anzahl der in Variable gespeicherten Zeichen, 0 falls Variable leer ist.

Page 23: Irina Deines Alexander Grinberg - HSRMweber/sysprog/proj08/shell_prog.pdf · 2008. 7. 7. · Alexander Grinberg Irina Deines 24. Juni 2008 5 Shells im Vergleich Anfang der 70er hat

Alexander GrinbergIrina Deines

24. Juni 2008 23

Variablen-Substitution – Beispiele

user$ cat new.shvar=Irinecho Guten Tag, $varaecho Guten Tag, ${var}auser$ bash new.shGuten Tag,Guten Tag, Irina

user$ cat new.shecho ${var:-Nicht Gesetzt}var=Irinaecho ${var:-Nicht Gesetzt}user$ bash new.shNicht GesetztIrina

user$ cat new.shecho $varecho ${var:=Irina}echo $varuser$ bash new.sh

IrinaIrina

Page 24: Irina Deines Alexander Grinberg - HSRMweber/sysprog/proj08/shell_prog.pdf · 2008. 7. 7. · Alexander Grinberg Irina Deines 24. Juni 2008 5 Shells im Vergleich Anfang der 70er hat

Alexander GrinbergIrina Deines

24. Juni 2008 24

ArithmetikBash interpretirert jede Zeile als String

Spezielle Syntax zur Auswertung arithmetischer Ausdrücke: $((ausdruck))

Operator Bedeutung-, + Vorzeichen!, ~ logische und bitweise Negation*, /, % Multiplikation, Division, Modulo+, - Addition, Subtraktion<<, >>

<=, >=, <, >

==,!= Test auf Gleichheit und Ungleichheit&, ^, | bitweises AND, XOR und OR&&, || logisches AND und OR

Links- und RechtsschtiftVegleichsoperatoren

Zuweisungs-operatoren: =, *=, /=,

%=, +=, -=,

<<=, >>=, &=,

^=, |=

Page 25: Irina Deines Alexander Grinberg - HSRMweber/sysprog/proj08/shell_prog.pdf · 2008. 7. 7. · Alexander Grinberg Irina Deines 24. Juni 2008 5 Shells im Vergleich Anfang der 70er hat

Alexander GrinbergIrina Deines

24. Juni 2008 25

Arithmetik

beginnt eine Zahl mit 0 wird sie als Oktal- mit 0x als Hexadezimalzahl interpretiert

user$ cat new.sha=12b=3var=$((12-34+$a-$b))echo $varecho $((4+9))echo $((2+$((3*4))))user$ bash new.sh-131314

user$ cat new.sha=$((010))b=$((10))c=$((0x10))echo $a $b $cuser$ bash new.sh8 10 16

Page 26: Irina Deines Alexander Grinberg - HSRMweber/sysprog/proj08/shell_prog.pdf · 2008. 7. 7. · Alexander Grinberg Irina Deines 24. Juni 2008 5 Shells im Vergleich Anfang der 70er hat

Alexander GrinbergIrina Deines

24. Juni 2008 26

Arithmetiklet erlaubt arithmetische Auswertungen für mehrere Ausdrücke:

let ausdruck1 audruck2 ausdruck3 ...

Folgende Operatoren sind erlaubt: -, +, *, /, **, %

user$ cat new.sh#!/bin/bashlet a=2+3 b=a**2 c=b%7 d=$((34+(-2+1)))echo $a $b $c $duser$ bash new.sh5 25 4 33

Fließkommazahlarithmetik ist nur möglich mit bc- oder dc-Rechner

Page 27: Irina Deines Alexander Grinberg - HSRMweber/sysprog/proj08/shell_prog.pdf · 2008. 7. 7. · Alexander Grinberg Irina Deines 24. Juni 2008 5 Shells im Vergleich Anfang der 70er hat

Alexander GrinbergIrina Deines

24. Juni 2008 27

Kontrollstrukturen – if

Syntax:

if Bedingung1then

Befehl1[elif Bedingung2then

Befehl2]...[else

Befehl3]fi

Geht auch als Einzeiler: if [Bedingung]; then Befehl;fi

Page 28: Irina Deines Alexander Grinberg - HSRMweber/sysprog/proj08/shell_prog.pdf · 2008. 7. 7. · Alexander Grinberg Irina Deines 24. Juni 2008 5 Shells im Vergleich Anfang der 70er hat

Alexander GrinbergIrina Deines

24. Juni 2008 28

Bedingungen mit Zeichenketten

Ausdruck BedeutungLänge von s1 ist ungleich 0.

[[ ''$s1'' == ''$s2'' ]] s1 und s2 sind identisch.

[[ ''$s1'' != ''$s2'' ]]

[[ ''$s1'' < ''$s2'' ]]

[[ ''$s1'' > ''$s2'' ]]

[[ -n ''$s1'' ]]

[[ -z ''$s1'' ]] Länge von s1 ist 0 oder s1 existiert nicht.

s1 und s2 sind nicht iden-tisch.s1 ist alphabetisch kleiner als s2.s1 ist alphabetisch größer als s2.

Page 29: Irina Deines Alexander Grinberg - HSRMweber/sysprog/proj08/shell_prog.pdf · 2008. 7. 7. · Alexander Grinberg Irina Deines 24. Juni 2008 5 Shells im Vergleich Anfang der 70er hat

Alexander GrinbergIrina Deines

24. Juni 2008 29

Bedingungen mit Zeichenkettenuser$ cat new.sh#!/bin/basha=Zeichenif [[ "$a"=="Array" ]]then

echo Jaelse

echo Neinfiif [[ "$a" == "Array" ]]then

echo Jaelse

echo Neinfiuser$ bash new.shJaNein

Page 30: Irina Deines Alexander Grinberg - HSRMweber/sysprog/proj08/shell_prog.pdf · 2008. 7. 7. · Alexander Grinberg Irina Deines 24. Juni 2008 5 Shells im Vergleich Anfang der 70er hat

Alexander GrinbergIrina Deines

24. Juni 2008 30

Bedingungen Logische Operatoren: !, && und ||

user$ cat new.sh#!/bin/basha=Zeichenb=Arrayif [[ "$a" == "Zeichen" && "$b" == "Array" ]]then

echo Jaelse

echo Neinfiuser$ bash new.shJa

Bedingung in Zeile 5 kann auch lauten: if [[ ''$a'' == ''Zeichen'' ]] && [[ ''$b'' == ''Array'' ]]

Page 31: Irina Deines Alexander Grinberg - HSRMweber/sysprog/proj08/shell_prog.pdf · 2008. 7. 7. · Alexander Grinberg Irina Deines 24. Juni 2008 5 Shells im Vergleich Anfang der 70er hat

Alexander GrinbergIrina Deines

24. Juni 2008 31

Kontrollstrukturen - caseSyntax:

case Wert in Muster1) Befehl1a;

Befehl1b;; Muster2) Befehl2;;...

esac

user$ cat new.sh#!/bin/bashf=Irinacase "$f" in

Anna)‏echo Anna $f;;Inga)‏echo Inga $f;;Irina)‏echo Irina $f;;

esacuser$ bash new.shIrina Irina

Page 32: Irina Deines Alexander Grinberg - HSRMweber/sysprog/proj08/shell_prog.pdf · 2008. 7. 7. · Alexander Grinberg Irina Deines 24. Juni 2008 5 Shells im Vergleich Anfang der 70er hat

Alexander GrinbergIrina Deines

24. Juni 2008 32

Schleifen – for

Syntax: for Variable [ in Liste]do

Befehledone

Geht auch als Einzeiler: for Variable [in Liste]; do Befehle; done

Liste kann sein: a b c, *.bck, $var, ${array[*]}, $*

Page 33: Irina Deines Alexander Grinberg - HSRMweber/sysprog/proj08/shell_prog.pdf · 2008. 7. 7. · Alexander Grinberg Irina Deines 24. Juni 2008 5 Shells im Vergleich Anfang der 70er hat

Alexander GrinbergIrina Deines

24. Juni 2008 33

Schleifen - Beispieleuser$ cat new.sh#!/bin/bashfor N in EINS ZWEI DREIdo

echo "N hat jetzt den Wert $N"doneuser$ bash new.shN hat jetzt den Wert EINSN hat jetzt den Wert ZWEIN hat jetzt den Wert DREI

user$ cat new.sh#!/bin/bashfor Ndo

echo "N hat jetzt den Wert $N"doneuser$ bash new.sh EINS ZWEI DREIN hat jetzt den Wert EINSN hat jetzt den Wert ZWEIN hat jetzt den Wert DREI

Page 34: Irina Deines Alexander Grinberg - HSRMweber/sysprog/proj08/shell_prog.pdf · 2008. 7. 7. · Alexander Grinberg Irina Deines 24. Juni 2008 5 Shells im Vergleich Anfang der 70er hat

Alexander GrinbergIrina Deines

24. Juni 2008 34

Schleifen - Beispiele

user$ cat new.sh#!/bin/bashls -lfor N in *do

chmod 700 $Ndonels -luser$ bash.shinsgesamt 12drwxr-xr-x 2 idein001 students 4096 19. Jun 14:38 dir-rw-r--r-- 1 idein001 students 65 21. Jun 16:27 new.sh-rw-r--r-- 1 idein001 students 68 21. Jun 15:58 new.sh~insgesamt 12drwx------ 2 idein001 students 4096 19. Jun 14:38 dir-rwx------ 1 idein001 students 65 21. Jun 16:27 new.sh-rwx------ 1 idein001 students 68 21. Jun 15:58 new.sh~

Page 35: Irina Deines Alexander Grinberg - HSRMweber/sysprog/proj08/shell_prog.pdf · 2008. 7. 7. · Alexander Grinberg Irina Deines 24. Juni 2008 5 Shells im Vergleich Anfang der 70er hat

Alexander GrinbergIrina Deines

24. Juni 2008 35

Schleifen – while u. until

solange Bedingungzutrifft

while Bedingung;do

Befehledone

solange Bedingung nicht zutrifft

until Bedingung;do

Befehledone

Page 36: Irina Deines Alexander Grinberg - HSRMweber/sysprog/proj08/shell_prog.pdf · 2008. 7. 7. · Alexander Grinberg Irina Deines 24. Juni 2008 5 Shells im Vergleich Anfang der 70er hat

Alexander GrinbergIrina Deines

24. Juni 2008 36

Schleifen - Beispiele

user$ cat new.sh#!/bin/bashN=1while $(( $N <= 3 ))‏do

echo "N hat jetzt den Wert $N"N=$(($N+1))

doneuser$ bash new.shN hat jetzt den Wert 1N hat jetzt den Wert 2N hat jetzt den Wert 3

user$ cat new.sh#!/bin/bashN=1until $(( $N == 3 ))‏do

echo "N hat jetzt den Wert $N"N=$(($N+1))

doneuser$ bash new.shN hat jetzt den Wert 1N hat jetzt den Wert 2

Page 37: Irina Deines Alexander Grinberg - HSRMweber/sysprog/proj08/shell_prog.pdf · 2008. 7. 7. · Alexander Grinberg Irina Deines 24. Juni 2008 5 Shells im Vergleich Anfang der 70er hat

Alexander GrinbergIrina Deines

24. Juni 2008 37

Schleifen

Beispiele für Endlosschleifen: while true;

while : ;

while [1];

while (( a == a ));

zum Abbruch eines Schleifendurchlaufs:continue [n]

zum Abbruch der ganzen Schleife:break [n]

Page 38: Irina Deines Alexander Grinberg - HSRMweber/sysprog/proj08/shell_prog.pdf · 2008. 7. 7. · Alexander Grinberg Irina Deines 24. Juni 2008 5 Shells im Vergleich Anfang der 70er hat

Alexander GrinbergIrina Deines

24. Juni 2008 38

Funktionen

fname { kdoliste;}

..............

fname arg1 arg2 .........

Funktinen sind nur in der Shell bekannt, in der sie definiert wurden. Soll eine Funktion auch an Subshells exportiert werden, muss der entsprechende Funktionsname mit export –f in der Environment-Datei definiert werden.

Page 39: Irina Deines Alexander Grinberg - HSRMweber/sysprog/proj08/shell_prog.pdf · 2008. 7. 7. · Alexander Grinberg Irina Deines 24. Juni 2008 5 Shells im Vergleich Anfang der 70er hat

Alexander GrinbergIrina Deines

24. Juni 2008 39

Funktionen

In Bash ist es möglich, funktionslokale Variablen mit dem builtin-Kommando local zu deklarieren. Bash-Funktionen können auch rekursiv aufgerufen werden. Ein- und Ausgabeumlenkung ist sowohl bei der Definition als auch beim Aufruf einer Shell-Funktion erlaubt.

Page 40: Irina Deines Alexander Grinberg - HSRMweber/sysprog/proj08/shell_prog.pdf · 2008. 7. 7. · Alexander Grinberg Irina Deines 24. Juni 2008 5 Shells im Vergleich Anfang der 70er hat

Alexander GrinbergIrina Deines

24. Juni 2008 40

Funktionen

user$ cat new.sh#!/bin/bashmult (){

let ergebnis=$(($1*$2))‏echo $ergebnis

}mult 2 3newergebnis=`mult 3 4`

echo $newergebnisuser$ bash new.sh612

Page 41: Irina Deines Alexander Grinberg - HSRMweber/sysprog/proj08/shell_prog.pdf · 2008. 7. 7. · Alexander Grinberg Irina Deines 24. Juni 2008 5 Shells im Vergleich Anfang der 70er hat

Alexander GrinbergIrina Deines

24. Juni 2008 41

Funktionenschwierig zwei Rückgabewerte zu bekommen:

user$ cat new.sh#!/bin/bashmultundadd1 (){

let ergebnis1=$(($1*$2))‏let ergebnis2=$(($1+$2))‏

}multundadd1 2 3echo $ergebnis1 $ergebnis2

user$ bash new.sh6 5

Page 42: Irina Deines Alexander Grinberg - HSRMweber/sysprog/proj08/shell_prog.pdf · 2008. 7. 7. · Alexander Grinberg Irina Deines 24. Juni 2008 5 Shells im Vergleich Anfang der 70er hat

Alexander GrinbergIrina Deines

24. Juni 2008 42

Funktionenuser$ cat new.sh#!/bin/bash#oder bessermultundadd2 (){

let erg1=$(($1*$2))‏let erg2=$(($1+$2))‏echo $erg1 $erg2

}declare -a arr=(`multundadd2 3 4`)‏echo ${arr[0]} ${arr[1]}

user$ bash new.sh12 7

Page 43: Irina Deines Alexander Grinberg - HSRMweber/sysprog/proj08/shell_prog.pdf · 2008. 7. 7. · Alexander Grinberg Irina Deines 24. Juni 2008 5 Shells im Vergleich Anfang der 70er hat

Alexander GrinbergIrina Deines

24. Juni 2008 43

Funktionen

Für die Wahl eines Funktionsnamens gelten die gleichen Regeln wie für die Wahl von Datei- und Variablennamen

Gleiche Funktions und Shellvariablen-Namen sind erlaubt.

return bewirkt das Verlassen einer Funktion

Page 44: Irina Deines Alexander Grinberg - HSRMweber/sysprog/proj08/shell_prog.pdf · 2008. 7. 7. · Alexander Grinberg Irina Deines 24. Juni 2008 5 Shells im Vergleich Anfang der 70er hat

Alexander GrinbergIrina Deines

24. Juni 2008 44

Funktionen

Die in der gerade aktiven bash definierten Funktionen können mittypeset –f oder mit declare -f

angezeigt werden.Mit

unset -f fname

kann die Definition wieder gelöscht werden.

Page 45: Irina Deines Alexander Grinberg - HSRMweber/sysprog/proj08/shell_prog.pdf · 2008. 7. 7. · Alexander Grinberg Irina Deines 24. Juni 2008 5 Shells im Vergleich Anfang der 70er hat

Alexander GrinbergIrina Deines

24. Juni 2008 45

Ausgabe mit echohat folgende Parameter:

-n unterdrückt den Zeilenumbruch am Ende der Ausgabe-e aktiviert die Interpretation von Steuerzeichen (sog. Escape-Sequenzen) (\t,\n,\c,\a)‏

String muss in '' gesetzt werden

user$ cat new.sh#!/bin/bashN="Beispiel"echo -e "$N \t Tabs \n Neue Zeile \c das ist ausgeblendet"echo -n "Ohne neue Zeile,"echo " noch ohne neue Zeile"user$ bash new.shBeispiel TabsNeue Zeile Ohne neue Zeile, noch ohne neue Zeile

Page 46: Irina Deines Alexander Grinberg - HSRMweber/sysprog/proj08/shell_prog.pdf · 2008. 7. 7. · Alexander Grinberg Irina Deines 24. Juni 2008 5 Shells im Vergleich Anfang der 70er hat

Alexander GrinbergIrina Deines

24. Juni 2008 46

Ausgabe mit printfSyntax: printf format arg1 arg2 ...

Formatzeichen Bedeutungs St ringc ASCII-Zeichend Dezimalzahli Integerf Fließkommazahl

e

u vorzeichenloser Integer

o

x

Fließkommazahl in e-Notat ion

vorzeichenlose Oktalzahlvorzeichenlose Hexadezimalzahl

user$ cat new.sh#!/bin/bashN="Beispiel"a=1printf "%-20s %s \n" $N $auser$ bash new.shBeispiel 1

Page 47: Irina Deines Alexander Grinberg - HSRMweber/sysprog/proj08/shell_prog.pdf · 2008. 7. 7. · Alexander Grinberg Irina Deines 24. Juni 2008 5 Shells im Vergleich Anfang der 70er hat

Alexander GrinbergIrina Deines

24. Juni 2008 47

Eingabe mit read

liest Eingaben von stdin und weist sie Variablen zuread var1 var2 ...

Rückgabewert ist 0, es sei denn ein Timeout oder EOF tritt ein

user$ cat new.sh#!/bin/bashread a b cecho "\$a:$a \$b:$b"echo "\$c:$c"user$ bash new.sherster zweiter$a:erster $b:zweiter$c:

weniger Worte gelesen als Variablennamen angegeben: Variable bleibt leermehr Worte gelesen als Variablennamen angegeben: letzte Varible bekommt den Rest der Eingabezeile

Page 48: Irina Deines Alexander Grinberg - HSRMweber/sysprog/proj08/shell_prog.pdf · 2008. 7. 7. · Alexander Grinberg Irina Deines 24. Juni 2008 5 Shells im Vergleich Anfang der 70er hat

Alexander GrinbergIrina Deines

24. Juni 2008 48

Eingabe - Beispieluser$ cat new.sh#!/bin/bashwhile truedo

read aif [[ "$a" == "q" ]]then

breakfiecho \'$a\' ist kein

qdoneuser$ bash new.shkjkfjbl'kjkfjbl' ist kein qq

erste Zeile aus einer Datei lesen:

user$ cat new.sh#!/bin/bashread a < new.shecho \'$a\'user$ bash new.sh'#!/bin/bash'

Page 49: Irina Deines Alexander Grinberg - HSRMweber/sysprog/proj08/shell_prog.pdf · 2008. 7. 7. · Alexander Grinberg Irina Deines 24. Juni 2008 5 Shells im Vergleich Anfang der 70er hat

Alexander GrinbergIrina Deines

24. Juni 2008 49

Eingabe - Beispiel

ganze Datei auslesen mit: while read var; do ...; done < datei

#!/bin/bashi=1while read a[$i]do

i+=1done < new.shj=1while (( j < i ))‏do

echo ${a[$j]}j+=1

done

Page 50: Irina Deines Alexander Grinberg - HSRMweber/sysprog/proj08/shell_prog.pdf · 2008. 7. 7. · Alexander Grinberg Irina Deines 24. Juni 2008 5 Shells im Vergleich Anfang der 70er hat

Alexander GrinbergIrina Deines

24. Juni 2008 50

Alias

Alias sind so etwas wie Mini-Funktionen, die keine Parameter kennen.

Man hinterlegt einen Befehl in einer Art Variablen, dem Alias, und benutzt fortan diesen Alias als Kürzel, um Zeit beim Eintippen zu sparen.

Mit dem Kommando alias können entweder Alias definiert oder aber momentan definierte Aliase angezeigt werden.

Page 51: Irina Deines Alexander Grinberg - HSRMweber/sysprog/proj08/shell_prog.pdf · 2008. 7. 7. · Alexander Grinberg Irina Deines 24. Juni 2008 5 Shells im Vergleich Anfang der 70er hat

Alexander GrinbergIrina Deines

24. Juni 2008 51

Alias

alias [name=[befehl]]

!!! Vor und nach dem Gleichheitszeichen darf kein Trennzeichen angegeben sein. !!!

agrin001@fozzie:~/Sys$ alias d='date'agrin001@fozzie:~/Sys$ d -RThu, 19 Jun 2008 17:28:31 +0200agrin001@lx2-06:~/Sys$ alias d= 'date'bash: alias: date: not found

Page 52: Irina Deines Alexander Grinberg - HSRMweber/sysprog/proj08/shell_prog.pdf · 2008. 7. 7. · Alexander Grinberg Irina Deines 24. Juni 2008 5 Shells im Vergleich Anfang der 70er hat

Alexander GrinbergIrina Deines

24. Juni 2008 52

Alias

agrin001@fozzie:~/Sys$ alias info='date; hostname; pwd'agrin001@fozzie:~/Sys$ infoThu Jun 19 17:28:43 CEST 2008fozzie/local/agrin001/Sysagrin001@fozzie:~/Sys$ aliasalias d='date'alias info='date; hostname; pwd'

Page 53: Irina Deines Alexander Grinberg - HSRMweber/sysprog/proj08/shell_prog.pdf · 2008. 7. 7. · Alexander Grinberg Irina Deines 24. Juni 2008 5 Shells im Vergleich Anfang der 70er hat

Alexander GrinbergIrina Deines

24. Juni 2008 53

Alias

Mit dem Befehl unalias wird ein solcher gelöscht.unalias [name].

Ist die Option –a möglich, um alle Aliase auf einmal zu löschen.

agrin001@fozzie:~/Sys$ unalias infoagrin001@fozzie:~/Sys$ aliasalias d='date'

agrin001@fozzie:~/Sys$ unalias-aagrin001@fozzie:~/Sys$ aliasagrin001@fozzie:~/Sys$

Page 54: Irina Deines Alexander Grinberg - HSRMweber/sysprog/proj08/shell_prog.pdf · 2008. 7. 7. · Alexander Grinberg Irina Deines 24. Juni 2008 5 Shells im Vergleich Anfang der 70er hat

Alexander GrinbergIrina Deines

24. Juni 2008 54

Alias

[befehl] kann ein beliebiger Text (einer Kommandozeile) sein. Wenn das letzte Zeichen von wert ein Leer- oder Tabulatorzeichen ist, dann prüft die Bash bei der Alias-Substitution auch noch das dem Alias folgende Wort daraufhin, ob es sich dabei um ein Alias handelt, das substituiert werden muss. Allgemein sollte immer dann ein Alias-Text mit einem Leer- oder Tabulatorzeichen enden, wenn einem Alias ein weiteres Alias folgen kann.

Page 55: Irina Deines Alexander Grinberg - HSRMweber/sysprog/proj08/shell_prog.pdf · 2008. 7. 7. · Alexander Grinberg Irina Deines 24. Juni 2008 5 Shells im Vergleich Anfang der 70er hat

Alexander GrinbergIrina Deines

24. Juni 2008 55

awk

Das ist eine Programmiersprache (Skriptsprache) zur Bearbeitung und Auswertung einfacher Textdaten.

awk wird in erste Linie dazu verwendet, Zeilen in einzelne Felder oder Wörter zu zerlegen, um gezielt auf bestimmte Daten innerhalb der Zeilen zuzugreifen.

Page 56: Irina Deines Alexander Grinberg - HSRMweber/sysprog/proj08/shell_prog.pdf · 2008. 7. 7. · Alexander Grinberg Irina Deines 24. Juni 2008 5 Shells im Vergleich Anfang der 70er hat

Alexander GrinbergIrina Deines

24. Juni 2008 56

awkSys$ cat new.sh#!/bin/bashecho eins zwei | awk '{print $1}'echo eins zwei | awk '{print $2}'echo eins zwei | awk '{printf "%s %s\n",$1,$2}'Sys$ bash new.sheinszweieins zwei

Page 57: Irina Deines Alexander Grinberg - HSRMweber/sysprog/proj08/shell_prog.pdf · 2008. 7. 7. · Alexander Grinberg Irina Deines 24. Juni 2008 5 Shells im Vergleich Anfang der 70er hat

Alexander GrinbergIrina Deines

24. Juni 2008 57

awk

Es verfügt über zahlreiche Stringsverarbeitungs- und mathematischesche Funktionen, mit denen man die Daten weiter aufbereiten und manipulieren kann; außerdem Variablen, Arrays, if- und Schleifen-Konstrukte und sogar über die Möglichkeit, eigene Funktionen zu definieren.

Wie schon gesagt ist awk selbst eine Programmiersprache, die in bash-Skripten verfügbar ist.

Page 58: Irina Deines Alexander Grinberg - HSRMweber/sysprog/proj08/shell_prog.pdf · 2008. 7. 7. · Alexander Grinberg Irina Deines 24. Juni 2008 5 Shells im Vergleich Anfang der 70er hat

Alexander GrinbergIrina Deines

24. Juni 2008 58

bc und dc

Manchmal braucht man Nachkommazahlarithmetik. Es ist möglich nur mit bc- oder dc-Rechner.

Leider stellen für Bash Nachkommazahlen nur Strings dar und der „normale“ Umgang mit ihnen ist in jedem Fall unmöglich.

Page 59: Irina Deines Alexander Grinberg - HSRMweber/sysprog/proj08/shell_prog.pdf · 2008. 7. 7. · Alexander Grinberg Irina Deines 24. Juni 2008 5 Shells im Vergleich Anfang der 70er hat

Alexander GrinbergIrina Deines

24. Juni 2008 59

bc und dcuser$ cat new.sh#!/bin/basha=$(echo "1.2*2"|bc)‏Echo $aecho $(($a+1)) #Das ist Falsch: a ist fuer Bash nur ein String.user$ bash new.sh2.4new.sh: line 4: 2.4+1: syntax error in expression (error token is ‏("4+1."

Page 60: Irina Deines Alexander Grinberg - HSRMweber/sysprog/proj08/shell_prog.pdf · 2008. 7. 7. · Alexander Grinberg Irina Deines 24. Juni 2008 5 Shells im Vergleich Anfang der 70er hat

Alexander GrinbergIrina Deines

Beispielprogramm

Page 61: Irina Deines Alexander Grinberg - HSRMweber/sysprog/proj08/shell_prog.pdf · 2008. 7. 7. · Alexander Grinberg Irina Deines 24. Juni 2008 5 Shells im Vergleich Anfang der 70er hat

Alexander GrinbergIrina Deines

Quellen

Patrick Ditchen: Shell-Skript ProgrammierungRonald Schaten: Shell-ProgrammierungMichael Kofler: Linux - Installation, Konfiguration, AnwendungHelmut Weber: Praktische Systemprogrammierunghttp://www.pronix.de/pronix-996.html

Page 62: Irina Deines Alexander Grinberg - HSRMweber/sysprog/proj08/shell_prog.pdf · 2008. 7. 7. · Alexander Grinberg Irina Deines 24. Juni 2008 5 Shells im Vergleich Anfang der 70er hat

Alexander GrinbergIrina Deines

Vielen Dank für Ihre Aufmerksamkeit!

Sind noch Fragen offen??