Shellprogrammierung
Transcrição
Shellprogrammierung
Operatoren Schleifen Case Funktionen Kommandos Signale Stringmanipulation Reguläre Ausdrücke Shellprogrammierung Einführung in Linux Antonia Blanke Shellprogrammierung Operatoren Schleifen Case Funktionen Kommandos Signale Stringmanipulation Reguläre Ausdrücke Operatoren:Zuweisung,Arithmetisch,Bitweise Logische Operatoren Andere Operatoren Operatoren Die Bash stellt verschiedene Operatoren zur Verfügung Zuweisungsoperatoren Arithmetische Operatoren Bitweise Operatoren Logische Operatoren Andere Operatoren Shellprogrammierung Operatoren Schleifen Case Funktionen Kommandos Signale Stringmanipulation Reguläre Ausdrücke Operatoren:Zuweisung,Arithmetisch,Bitweise Logische Operatoren Andere Operatoren Operatoren:Zuweisung,Arithmetisch,Bitweise Zuweisungsoperatoren =, Bsp.: variable=27 Nicht mit dem ’=’ Testoperator zu verwechseln! Arithmetische Operatoren +, -, *, /, ** (Exponentierung), % (Modulo), +=, -=, *=, /=, %= Bitweise Operatoren <<, <<=, >>, >>=, &, &=,|, | =, v, !, ∧, ∧ = kommen in Shellskripten eher selten zur Anwendung Shellprogrammierung Operatoren Schleifen Case Funktionen Kommandos Signale Stringmanipulation Reguläre Ausdrücke Operatoren:Zuweisung,Arithmetisch,Bitweise Logische Operatoren Andere Operatoren Logische Operatoren && (Logisches Und), || (Logisches Oder) && führt jedes Statement von links aus sofern das letzte ausgeführte true war. Ansonsten wird vorher abgebrochen. || führt die Statements von links aus und bricht ab sobald eines true ist Die Reihenfolge der Ausführungen und Abbrüche ist relevant, weil man logische Operatoren auch zum Verknüpfen von Kommandos nutzen kann. Shellprogrammierung Operatoren Schleifen Case Funktionen Kommandos Signale Stringmanipulation Reguläre Ausdrücke Operatoren:Zuweisung,Arithmetisch,Bitweise Logische Operatoren Andere Operatoren Andere Operatoren , (Komma Operator) verketten mehrere Operatoren hintereinander mit zwei oder mehreren arithmetischen Operationen. Alle werden ausgewertet, aber nur die letzte zurückgegeben. Bsp.: let t2= (( a = 9, 15 / 3 )) Nach diesem Aufruf ist a=9 und t2=5 Shellprogrammierung Operatoren Schleifen Case Funktionen Kommandos Signale Stringmanipulation Reguläre Ausdrücke for-Schleife while-Schleife until-Schleife Schleifen Schleifen sind Quelltextblöcke, die eine Liste von Kommandos bearbeiten, solange die Bedingung der Schleife wahr ist. Es gibt drei Schleifentypen for-Schleife while-Schleife until-Schleife Shellprogrammierung Operatoren Schleifen Case Funktionen Kommandos Signale Stringmanipulation Reguläre Ausdrücke for-Schleife while-Schleife until-Schleife for-Schleife Achtung: Unterscheidet sich stark von der for-Schleife wie man sie z.B. von C/C++ oder Java kennt! Syntax: for arg in [list]; do Kommando(s) .. done; Während jeden Schleifendurchlaufs wird ein Element aus [list] geholt und arg zugewiesen Bsp.: for i in 1 2 3 4 do echo $i; done; C/Java ähnliche Syntax for (( i=1;i¡10;i++ )); do echo $i; done; Shellprogrammierung Operatoren Schleifen Case Funktionen Kommandos Signale Stringmanipulation Reguläre Ausdrücke for-Schleife while-Schleife until-Schleife while-Schleife Hier wird die Bedingung am Anfang der Schleife getestet und loopt so lange wie die Bedingung wahr ist. Syntax: while [ Bedingung ]; do Kommando(s) done; Bsp.: i=0; while [ $i -lt 10 ]; do echo $i; i=‘expr $i + 1‘; done; C/Javaähnliche Syntax i=0; while (( $i ¡ 10 )); do echo $i; (( i += 1 )); done; Shellprogrammierung Operatoren Schleifen Case Funktionen Kommandos Signale Stringmanipulation Reguläre Ausdrücke for-Schleife while-Schleife until-Schleife until-Schleife Hier wird am Anfang der Schleife die Bedingung getestet und loopt solang wie die Bedingung falsch ist. Syntax: until [ Bedingung ]; do Kommando(s) ...; done; Bsp.: input=1; until [ $input = read input; done; ]; do echo ’Eingabe:’; Shellprogrammierung Operatoren Schleifen Case Funktionen Kommandos Signale Stringmanipulation Reguläre Ausdrücke Case: Beispiel Case: Wildcards Case Das Case Konstrukt erlaubt den Vergleich einer Variable gegen vorgegebene Muster Syntax: case variable in pattern [ — pattern ] ... ) Kommando(s);; pattern [ — pattern ] ... ) Kommando(s);; ... Shellprogrammierung Operatoren Schleifen Case Funktionen Kommandos Signale Stringmanipulation Reguläre Ausdrücke Case: Beispiel Case: Wildcards Case: Beispiel echo Ist es morgens? (j/n/ja/nein): read timeofday; case $timeofday in j—ja) echo ’Guten Morgen!’;; n—nein) echo ’Guten Abend!’;; ∗) echo ’Ungültige Eingabe!’;; esac Shellprogrammierung Operatoren Schleifen Case Funktionen Kommandos Signale Stringmanipulation Reguläre Ausdrücke Case: Beispiel Case: Wildcards Case: Wildcards In dem Case Konstrukt sind auch Wildcards erlaubt, dabei wird dann nicht nach dem besten Match gesucht, sondern dem ersten. Bsp.: echo Ist es morgens? (j*/n*): read timeofday; case $timeofday in j*) echo ’Guten Morgen!’;; n*) echo ’Guten Abend!’;; *) echo ’Ungültige Eingabe!’;; esac Shellprogrammierung Operatoren Schleifen Case Funktionen Kommandos Signale Stringmanipulation Reguläre Ausdrücke Funktionen: Beispiel Funktionen: Returnstatus Funktionen: Returnstatus Beispiel Funktionen Funktionen müssen immer vor ihrem Aufruf definiert werden! Skriptparameter wie $*, $@, $#, $1, etc. werden bei Funktionsaufruf mit ihren zugehörigen Funktionswerten ersetzt. Syntax: function name() { Kommandos...; } Shellprogrammierung Operatoren Schleifen Case Funktionen Kommandos Signale Stringmanipulation Reguläre Ausdrücke Funktionen: Beispiel Funktionen: Returnstatus Funktionen: Returnstatus Beispiel Funktionen: Beispiel foo() { echo hallo aus Funktion ’foo’ } echo ’Skript startet’; foo echo ’Skript endet’; Shellprogrammierung Operatoren Schleifen Case Funktionen Kommandos Signale Stringmanipulation Reguläre Ausdrücke Funktionen: Beispiel Funktionen: Returnstatus Funktionen: Returnstatus Beispiel Funktionen Auch Funktionen geben einen Returntatus zurück. Dafür gibt es den Befehl ’return’. Mit ’local variablenname’ kann man eine Variable für die Funktion lokal definieren, was z.B. Rekursion ermöglicht Funktionen können auch Argumente annehmen. Das Handling ist genauso wie bei Skriptargumenten, die aus der Kommandozeile kommen, also $1, $2, etc. Shellprogrammierung Operatoren Schleifen Case Funktionen Kommandos Signale Stringmanipulation Reguläre Ausdrücke Funktionen: Beispiel Funktionen: Returnstatus Funktionen: Returnstatus Beispiel Funktionen: Returnstatus Beispiel foo() { echo Argument: $1 ; return 0; } echo ’Skript startet’; foo Ich bin das Argumet echo ’Skript endet’; Shellprogrammierung Operatoren Schleifen Case Funktionen Kommandos Signale Stringmanipulation Reguläre Ausdrücke Eingebaute Kommandos: break, continue Kommandos: echo,eval Kommandos: echo,eval Beispiel Kommandos: exec,exit,export,expr,printf,return Kommandos: set, shift Kommandos: unset, sleep, trap Kommandos Es gibt zwei verschiedene Formen von Kommandos in Shellskripten Die eingebauten Kommandos, die intern in der Shell implementiert sind Die externen Kommandos, die eine entsprechend ausführbare Datei im Filesystem haben Die meisten Kommandos sind extern Es ist meist egal, ob ein Kommando intern oder extern ist. Der einzige Unterschied ist, dass interne effizienter ausgeführt werden können. Shellprogrammierung Operatoren Schleifen Case Funktionen Kommandos Signale Stringmanipulation Reguläre Ausdrücke Eingebaute Kommandos: break, continue Kommandos: echo,eval Kommandos: echo,eval Beispiel Kommandos: exec,exit,export,expr,printf,return Kommandos: set, shift Kommandos: unset, sleep, trap Eingebaute Kommandos: break, continue break wird genutzt, um eine Schleife vorzeitig abzubrechen, bevor die Schleifenbedingung erfüllt worden ist continue in der Schleife bewirkt, dass der Rest der Schleife übersprungen und bei er nächsten Iteration fortgesetzt wird . führt ein Kommando in der momentanen Shell aus, wobei die Umgebung tatsächlich die gleiche ist; d.h. von solchen ausgeführten Kommandos können Umgebungsvariablen überschrieben werden Bsp.: .shellskript Shellprogrammierung Operatoren Schleifen Case Funktionen Kommandos Signale Stringmanipulation Reguläre Ausdrücke Eingebaute Kommandos: break, continue Kommandos: echo,eval Kommandos: echo,eval Beispiel Kommandos: exec,exit,export,expr,printf,return Kommandos: set, shift Kommandos: unset, sleep, trap Kommandos: echo,eval echo gibt einen String aus. Der Parameter -n bewirkt, dass kein Zeilenumbruch erzeugt wird eval [args ...] werden gelesen und in ein einzelnes Kommando zusammenkopiert, welches dann von der Shell gelesen und ausgeführt wird Shellprogrammierung Operatoren Schleifen Case Funktionen Kommandos Signale Stringmanipulation Reguläre Ausdrücke Eingebaute Kommandos: break, continue Kommandos: echo,eval Kommandos: echo,eval Beispiel Kommandos: exec,exit,export,expr,printf,return Kommandos: set, shift Kommandos: unset, sleep, trap Kommandos: echo,eval Beispiel foo=10; x=foo; y=’$’$x echo $y Die Ausgabe ist hier $foo, aber foo=10; x=foo; eval y=’$’$x echo $y ergibt die Ausgabe 10. Es wird also nicht der Strng $foo ausgegeben, sondern dessen Wert Erinnerung: bei y=’$’$x muss das erste $ in einfache Anführungszeichen gesetzt werden, da $$ sonst als ProzessID ausgewertet wird Shellprogrammierung Operatoren Schleifen Case Funktionen Kommandos Signale Stringmanipulation Reguläre Ausdrücke Eingebaute Kommandos: break, continue Kommandos: echo,eval Kommandos: echo,eval Beispiel Kommandos: exec,exit,export,expr,printf,return Kommandos: set, shift Kommandos: unset, sleep, trap Kommandos: exec,exit,export,expr,printf,return exec wird genutzt um die momentane Shell mit der anderen zu ersetzen Bsp.: ’exec ksh’ würde die momentane Shell mit der Korn Shell ersetzen exit gibt Exit Status zurück export setzt eine Umgebungsvariable expr wertet seine Argumente als einen arithmetischen Ausdruck aus Bsp.: x=‘expr $x + 1‘ inkrementiert um 1 In Bashskripten wird häufig die effizientere $((..)) Syntax verwendet ( x=$(( x + 1 ))) printf ist ähnlich dem printf aus C/C++, aber etwas einfacher Shellprogrammierung Bsp.: printf %s %d Operatoren Schleifen Case Funktionen Kommandos Signale Stringmanipulation Reguläre Ausdrücke Eingebaute Kommandos: break, continue Kommandos: echo,eval Kommandos: echo,eval Beispiel Kommandos: exec,exit,export,expr,printf,return Kommandos: set, shift Kommandos: unset, sleep, trap Kommandos: set, shift set setzt die Argumentvariablen $1, $2, .. neu. Dies kann sinnvoll sein, um aus Programmen durch Zeichen getrennte Werte zu extrahieren Bsp.: set ‘uname -a‘ bewirkt, dass $1 den Kernel, $2 den Hostnamen, $3 die Kernelversion etc. beinhalten anstatt der Skriptargumente shift bewirkt, dss die Argumentvariablen $1, $2, ... jeweils um eins nach links verschoben werden, d.h. $2 wird $1, $3 wird $2, ... Der Wert von $1 geht verloren und $0 bleibt immer unverändert. shift wird meist genutzt, um die Argumente nach bestimmten Mustern zu durchsuchen. $# usw. werden automatisch entsprechend mit angepasst. Shellprogrammierung Operatoren Schleifen Case Funktionen Kommandos Signale Stringmanipulation Reguläre Ausdrücke Eingebaute Kommandos: break, continue Kommandos: echo,eval Kommandos: echo,eval Beispiel Kommandos: exec,exit,export,expr,printf,return Kommandos: set, shift Kommandos: unset, sleep, trap Kommandos: unset, sleep, trap unset entfernt Variablen aus der Umgebung sleep n wartet n Sekunden trap wird benutzt, damit bei Empfang von Signalen bestimmte Aktionen durchgeführt werden können Bsp.: trap Kommando signal Shellprogrammierung Operatoren Schleifen Case Funktionen Kommandos Signale Stringmanipulation Reguläre Ausdrücke Signale und trap Signale: Beispiel Signale Das Betriebssystem sendet bei bestimmten Anlässen, z.B. Programmabbruch, Signale die von Programmen und Skripten zur Programmsteuerung verwendet werden können. HUP - Hang Up; Wird gesendet wenn sich ein User ausloggt INT - Interrupt; Wird gesendet wenn Ctrl-C gedrückt wird;Programmabbruch QUIT - Wird gesendet wenn Ctrlgedrückt wird ABRT - Wird bei schweren Fehlern gesendet ALRM - Wird bei einem Time-Out gesendet TERM - Terminate; Wird gesendet wenn das System herunter fährt Shellprogrammierung Operatoren Schleifen Case Funktionen Kommandos Signale Stringmanipulation Reguläre Ausdrücke Signale und trap Signale: Beispiel Signale und trap Das Kommando trap kann bei Ankunft von Signalen Kommandos ausführen Eine häufige Anwendung ist das Löschen von temporären Dateien bei Programmabbruch (Signal INT) Shellprogrammierung Operatoren Schleifen Case Funktionen Kommandos Signale Stringmanipulation Reguläre Ausdrücke Signale und trap Signale: Beispiel Beispiel trap ’rm -f /tmp/my tmp file $$’ INT echo erzeuge temp datei /tmp/my tmp file $$ while [ -f /tmp/my tmp file $$ ]; do echo Datei existiert noch sleep 1 done; echo ’Datei ist gelöscht!’ Shellprogrammierung Operatoren Schleifen Case Funktionen Kommandos Signale Stringmanipulation Reguläre Ausdrücke Substring Substring Substring Substring Entfernung Entfernung II Ersetzung Ersetzung II Stringmanipulation Die Bash stellt einige interessante Möglichkeiten zur Verfügung Strings zu manipulieren. Einige sind eingebaut, andere nutzen expr Stringlänge: ${#string} Länge der Stringübereinstimmung am Anfang des String expr match $string ’$substring’, wobei $substring ein regulärer Ausdruck ist Bsp.: string=abcdefg; echo ‘expr match $string ’abc[a-e]*’‘ Position eines Substrings in einem String expr index $string ’$substring’ Substring Extrahieren ${ string:position} oder ${ string:position:länge} Shellprogrammierung Operatoren Schleifen Case Funktionen Kommandos Signale Stringmanipulation Reguläre Ausdrücke Substring Substring Substring Substring Entfernung Entfernung II Ersetzung Ersetzung II Substring Entfernung ${ string#substring entfernt die kürzeste Übereinstimmung von $substring vom Anfang des Strings $string Bsp.: string=abcdef; b=${ string#a*c}; echo $b Ausgabe: abcdef ${ string##substring} entfernt die längste Übereinstimmung von $substring vom Anfang des Strings $string Bsp.: string=abcabcdef: b=${ string#a*c}; echo $b Ausgabe: def Shellprogrammierung Operatoren Schleifen Case Funktionen Kommandos Signale Stringmanipulation Reguläre Ausdrücke Substring Substring Substring Substring Entfernung Entfernung II Ersetzung Ersetzung II Substring Entfernung II ${ string%substring} entfernt die kürzeste Übereinstimmung von $substring vom Ende des Strings $string Bsp.: string=abcdefdef; b=${ string%d*f}; echo $b; Ausgabe: abcdef Analog entfernt ${ string%%substring} wieder die längste Übereinstimmung Shellprogrammierung Operatoren Schleifen Case Funktionen Kommandos Signale Stringmanipulation Reguläre Ausdrücke Substring Substring Substring Substring Entfernung Entfernung II Ersetzung Ersetzung II Substring Ersetzung ${ string/substring/ersetzung} ersetzt die erste Übereinstimmung von $substring mit $ersetzung ${ string//substring/ersetzung} ersetzt alle Übereinstimmungen von $substring mit $ersetzung ${ string/#substring/ersetzung} ersetzt den substring mit $ersetzung falls der Anfang von $string mit $substring übereinstimmt Shellprogrammierung Operatoren Schleifen Case Funktionen Kommandos Signale Stringmanipulation Reguläre Ausdrücke Substring Substring Substring Substring Entfernung Entfernung II Ersetzung Ersetzung II Substring Ersetzung II ${ string/%substring/ersetzung} ersetzt den substring mit $ersetzung falls das Ende von $string mit $substring übereinstimmt Sehr mächtige Tools zur Stringmanipulation sind die Programme sed und awk, die von der Bash aus aufgerufen werden können Shellprogrammierung Operatoren Schleifen Case Funktionen Kommandos Signale Stringmanipulation Reguläre Ausdrücke Grundlagen Metazeichen Die wichtigsten Metazeichen Die wichtigsten Metazeichen (2) Erweiterte Syntax Abkürzungen Fazit Abschliessende Beispiele Definition und Anwendung Reguläre Ausdrücke beschreiben ein Zeichenmuster bzw. eine Sequenz von Zeichen Sie arbeiten mit Meta-Zeichen, die in der Beschreibung des Ausdrucks immer eine bestimmte Bedeutung oder Funktion haben Man nutzt reguläre Ausdrücke um eine Menge von Zeichenketten zu beschreiben anstatt einer einzelnen. grep, sed und awk sind bekannte Programme, die reguläre Ausdrücke nutzen und in der Linux/Unix Shell zum Einsatz kommen Shellprogrammierung Operatoren Schleifen Case Funktionen Kommandos Signale Stringmanipulation Reguläre Ausdrücke Grundlagen Metazeichen Die wichtigsten Metazeichen Die wichtigsten Metazeichen (2) Erweiterte Syntax Abkürzungen Fazit Abschliessende Beispiele Grundlagen Die grundlegenste Eigenschaft eines regulären Ausdruckes ist die Verkettung von Zeichen Der Ausdruck ’ABE’ beschreibt eine Zeichenkette bei der dem A ein B folgt, und dem B ein E Reguläre Ausdrücke sind meist Case-Sensitiv, d.h. in dem oben genannten Beispiel würde die Zeichenkette ’abe’ nicht von dem Ausdruck beschrieben werden Shellprogrammierung Operatoren Schleifen Case Funktionen Kommandos Signale Stringmanipulation Reguläre Ausdrücke Grundlagen Metazeichen Die wichtigsten Metazeichen Die wichtigsten Metazeichen (2) Erweiterte Syntax Abkürzungen Fazit Abschliessende Beispiele Metazeichen Interessant werden reguläre Ausdrücke erst, wenn man auch Metazeichen benutzt. Diese werden an Literale angehängt, um das Verhalten dieser im Ausdruck flexibler auszudrücken. Beispiele: Das Metazeichen * bedeutet ’keines oder mehr’ Der Ausdruck A*E bedeutet ’kein oder beliebig viel A gefolgt von einem E’ AAAAAE wird von diesem Ausdruck beschrieben E wird von diesem Ausdruck beschrieben ABE wird nicht von diesem Ausdruck beschrieben Shellprogrammierung Operatoren Schleifen Case Funktionen Kommandos Signale Stringmanipulation Reguläre Ausdrücke Grundlagen Metazeichen Die wichtigsten Metazeichen Die wichtigsten Metazeichen (2) Erweiterte Syntax Abkürzungen Fazit Abschliessende Beispiele Die wichtigsten Metazeichen * ’keines oder mehr Zeichen’ . ’genau ein Zeichen’ [..] eines aus der in den eckigen Klammern definierten Klasse von Zeichen Ein ∧ invertiert die Bedeutung der Klammer Ein - gibt einen Zeichenbereich an Shellprogrammierung Operatoren Schleifen Case Funktionen Kommandos Signale Stringmanipulation Reguläre Ausdrücke Grundlagen Metazeichen Die wichtigsten Metazeichen Die wichtigsten Metazeichen (2) Erweiterte Syntax Abkürzungen Fazit Abschliessende Beispiele Die wichtigsten Metazeichen (2) ∧ das erste Zeichen eines regulären Ausdrucks $ das letzte Zeichen eines regulären Ausdrucks \{n, m\} matcht einen Bereich des vorhergehenden Zeichens \ escaped ein Zeichen mit Sonderfunktion Beispiele: [A − Z]\{5\} beschreibt Zeichenketten die Zeichen zwischen A und Z mit genau der Länge 5 haben [A − Z]\{5, \} beschreibt Zeichenketten die Zeichen zwischen A und Z mit mindestens der Länge 5 haben [A − Z]\{5, 10\} beschreibt Zeichenketten die Zeichen zwischen A und Z mit mindestens 5 und maximal 10 Zeichen länge Shellprogrammierung Operatoren Schleifen Case Funktionen Kommandos Signale Stringmanipulation Reguläre Ausdrücke Grundlagen Metazeichen Die wichtigsten Metazeichen Die wichtigsten Metazeichen (2) Erweiterte Syntax Abkürzungen Fazit Abschliessende Beispiele Erweiterte Syntax nach POSIX (egrep, awk) + eins oder mehr der vorherigen Zeichens ? genau eins oder keins des vorherigen Zeichens | Oder-Verknüpfung; entweder der vorhergehende oder der nachfolgende Ausdruck kann zum Matchen des Ausdrucks verwendet werden (...) gruppiert reguläre Ausdrücke { n,m} wie \{n, m\} (Nur in der POSIX-Version von egrep und awk) Shellprogrammierung Operatoren Schleifen Case Funktionen Kommandos Signale Stringmanipulation Reguläre Ausdrücke Grundlagen Metazeichen Die wichtigsten Metazeichen Die wichtigsten Metazeichen (2) Erweiterte Syntax Abkürzungen Fazit Abschliessende Beispiele Abkürzungen für Zeichenklassen :alnum: Alphanumerische Zeichen ( = [a-zA-Z0-9]) :alpha: Zeichen des Alphabets :digit: Numerische Zeichen (Ziffern, Plus, Minus) :blank: Leerzeichen und Tabulator :space: Whitespaces :punct: Satzzeichen :lower: Kleinbuchstaben :upper: Großbuchstaben ... Shellprogrammierung Operatoren Schleifen Case Funktionen Kommandos Signale Stringmanipulation Reguläre Ausdrücke Grundlagen Metazeichen Die wichtigsten Metazeichen Die wichtigsten Metazeichen (2) Erweiterte Syntax Abkürzungen Fazit Abschliessende Beispiele Fazit Einzelne reguläre Ausdrücke sind einigermaßen zu verstehen. Es ist häufig problematisch einen Gesamtkontext zu erfassen Man sollte sich vorher genau im klaren sein, was der Ausdruck beschreiben soll Reguläre Ausdrücke sollte immer sehr ausführlich getestet werden, bevor sie in einem Skript zur Anwendung kommen Es gibt häufig Unterschiede im Umfang der Implementationen von regulären Ausdrücken in Unix Tools Shellprogrammierung Operatoren Schleifen Case Funktionen Kommandos Signale Stringmanipulation Reguläre Ausdrücke Grundlagen Metazeichen Die wichtigsten Metazeichen Die wichtigsten Metazeichen (2) Erweiterte Syntax Abkürzungen Fazit Abschliessende Beispiele Abschliessende Beispiele Datum der Form DD-MM-YYYY [0-9]–2˝-[0-9]–2˝-[0-9]–4˝ HTML Tag ¡[ˆ¿]*¿ E-Mail-Adresse (nicht 100“%) ˆ([“˙a-z0-9-]+)(“.[a-z0-9-+])*@([a-z0-9-]+“.)+([a-z]–2,4˝ Shellprogrammierung