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