Werkzeuge: Programmierung mit der Shell unter Linux
Released by matroid on Do. 12. April 2007 22:55:58 [Statistics]
Written by javaguru - 3978 x read [Outline] Printable version Printer-friendly version -  Choose language   
Informatik

\(\begingroup\)

Linux&Unix-Shell

Teil 2

Herzlich Willkommen zum zweiten Teil dieser kleinen Serie zur Programmierung mit der Shell unter Linux und Unix. Ich wünsche weiterhin viel Spaß beim Lesen von diesem Artikel. [Teil 1]

Arithmetik

Arithmetische Operationen werden über die Shellkommados expr und let realisiert. Dabei ist let ein internes Kommando der Bash und expr ein Externes. Es ist sowohl möglich Brechnungen mit Hilfe des Kommandoaufrufes zu machen, als auch durch eine verkürzte Schreibweise, wie man diesem Codeschnipsel entnehmen kann. \sourceonSHELL #!/bin/sh z='expr $z + 3' # Aufruf des externen Kommandos expr let z=z+3 # Aufruf des internen Kommandos let "z += 3" # Mit Quotes sind Leerzeichen und special operators erlaubt z=$(($z+3)) # neue verkuerzte Schreibweise z=$[$z+3] # alte Schreibweise \sourceoff Berechnungen finden, wie in C, mit "lange Ganzzahlwerten" statt. Eine Überlaufkontrolle gibt es nicht. Division durch Null führt zu einem Fehler, der aber mit Hilfe der trap-Shellfunktion abgefangen werden kann. Folgende Operatoren sind erlaubt: \sourceonSHELL + - Vorzeichen ! ~ logische und bitweise Negation * / % Multiplikation, Division, Modulo + - Addition und Subtraktion << >> bitweise links und rechts-Shift-Operation <= >= <> Vergleiche == != gleich und ungleich & bitweise Addition ~ bitweise XOR | bitweise ODER && bitweise UND || logisches ODER \sourceoff

Funktionen

Wie auch in C, kann man in der Bash einzelne Programmteile zu Funktionen zusammenfassen. Mit dem local-Shellkommando ist es möglich, lokale Variablen für Scriptfunktionen zu erzeugen. Mit return können Werte aus einer Funktion zurückgegeben werden. \sourceonSHELL #! /bin/bash myadd() { # $1 erstes Argument tmp=0 args=$@ for i in $args do tmp='expr $tmp + $i' done return $tmp } # main myadd 1 2 3 $VAR RES=$? echo $RES # Ausgabe: 6 myadd $RES 5 6 $VAR2 RES=$? echo $RES # Ausgabe: 17 \sourceoff

Ein-/Ausgabe-Umleitungen

Jedes Programm erhält beim Start drei offene "Datenkanäle": \sourceonSHELL Standard Input: STDIN (0) Standard Output: STDOUT (1) Standard Error Output: STDERR (2) \sourceoff Durch das Umlenken der Ein-/Ausgabekanaele können Dateien oder Dateisysteme zum Lesen bzw. Schreiben für Kommandos geöffnet werden. Es gibt viele Möglichkeiten Daten umzuleiten. Hier ist deshalb nur eine kleine Auswahl: \sourceonSHELL COMMANDoutfile Ausgabeumlenkung COMMAND»outfile Ausgabeumlenkung, anhängen COMMAND 2>&1 STDERR mit auf STDOUT legen \sourceoff

Pipes

Bei einer Pipe wird der Standardausgabekanal eines Kommandos mit dem Standardeingabekanal eines anderen Kommandos zusammengelegt. Dabei werden beide Kommandos als separate Prozesse gleichzeitig gestartet. Beim folgenden Beispiel wird der Inhalt der Datei test.txt durch das Tool cat auf den Standardausabekanal geschrieben und an grep über den Standardeingabekanal übergeben. Grep sucht nach allen Zeilen die das Wort "Mathe" enthalten, und gibt diese dann in der Shell aus. \sourceonSHELL lxuser% cat text.txt|grep -i Mathe export Mathe=1000 \sourceoff

grep

Ich werde jetzt in diesem Abschnitt kurz erläutern, was es mit dem Tool grep auf sich hat, denn dieses Tool tauchte schon etwas öfters in meinem Artikel auf und nun gebe ich noch einige weitere Informationen darüber. Die Syntax für diesen Befehl lautet \sourceonSHELL grep [-CVbchilnsvwx] [-Anzahl] [-AB Anzahl] [[-e] Ausdruck | -f Datei] [Datei...] \sourceoff Der Stern und der Punkt sind Sonderzeichen. Will man nach Mustern suchen, die den Punkt als literarisches Zeichen auffassen, so muss dieser speziell maskiert werden. \sourceonSHELL ls | grep Name.ext \sourceoff listet auch Dateie mit dem Namen Name0ext , NameBext , usw. auf. . \sourceonSHELL ls | grep Name\.ext \sourceoff listet nur die Datei mit dem Namen Name.ext auf. . Wir wollen in einem Textfile alle Zeilen, die den Namen Fred Feuerstein und Fredericke Feuerstein enthalten. Das bedeutet der Teil "ericke" ist optional. Dazu benutzen wir den folgenden Code \sourceonSHELL grep "Fred\(ericke\)\? Feuerstein" textfile \sourceoff Die Klammern bilden eine Gruppe. Das Fragezeichen bedeutet ein oder kein Vorkommen des vorherigen Musters. Hier werden Klammern innerhalb anderer Klammern ausgeschlossen: \sourceonSHELL grep "([^()]*)" \sourceoff Dieser Codeschnipsel sucht nach Texteilen, wie zum Beispiel (hello) und (aksjdhaksj d ka), aber nicht nach x=(y+2(x+1)). Jetzt wollen wir nach sich wiederholenden Mustern suchen. Eine gutes Beispiel sind Telefonnummern. Wir suchen nach einer Vorwahl (4 Ziffern) und der Nummer (6 Ziffern), getrennt durch einen - , einem Leerzeichen oder gar nicht. (Bei uns in Kiel sind die Telefonnummern so aufgebaut, es gibt natürlich auch Vorwahlen mit 3 oder 5 Ziffern. Dafür kann man dann das Beispiel einfach umbasteln.) \sourceonSHELL grep "[0-9]\{4\}[ -]\?[0-9]\{6\}" file \sourceoff [0-9] steht für alle Zahlen, \{4\} besagt, dass sich das vorherige Muster 4 mal wiederholen soll. [ -]\? repräsentiert die Auswahl des Trennzeichens (Leerzeichen, - oder gar nichts). Angenommen, wir suchen eine Zeile in der nur das Wort "Hallo" steht. Es ist zudem noch möglich, dass sich vor und/oder hinter "Hallo" Leerzeichen befinden. Eine Möglichkeit wäre der folgende Codeschnipsel \sourceonSHELL grep "^[[:space:]]*Hallo[[:space:]]*$" file \sourceoff ^ steht für den Zeilenanfang, $ für das Zeilenende. Manchmal ist es nötig, Zeilen zu suchen, in denen entweder das Eine oder das Andere steht. Auch dazu gibt es einen kurzen Codeschnipsel \sourceonSHELL grep "Ich mag den \(HSV\|FC Bayern München\) sehr gerne." file \sourceoff \| entspricht dabei dem logischen ODER.

Abschluss

So. Ich hoffe, dass ich dem Einen oder Anderen von euch helfen konnte und ihr nun bereit seid ein wenig mit der Shell unter Linux oder Unix zu arbeiten. javaguru
\(\endgroup\)
Get link to this article Get link to this article  Printable version Printer-friendly version -  Choose language     Kommentare zeigen Comments  
pdfFür diesen Artikel gibt es keine pdf-Datei


Arbeitsgruppe Alexandria Dieser Artikel ist im Verzeichnis der Arbeitsgruppe Alexandria eingetragen:
: Informatik :: Werkzeuge :: Linux :: Unix :: Shell :: Programmierung :
Programmierung mit der Shell unter Linux [von javaguru]  
Zweiter Teil zur Programmierung in der Shell unter Linux und Unix.
[Die Arbeitsgruppe Alexandria katalogisiert die Artikel auf dem Matheplaneten]

 
 
Aufrufzähler 3978
 
Aufrufstatistik des Artikels
Insgesamt 53 externe Seitenaufrufe zwischen 2012.01 und 2022.11 [Anzeigen]
DomainAnzahlProz
https://google.com23.8%3.8 %
http://google.de4890.6%90.6 %
http://google.com23.8%3.8 %
http://google.at11.9%1.9 %

Häufige Aufrufer in früheren Monaten
Insgesamt 34 häufige Aufrufer [Anzeigen]
DatumAufrufer-URL
2012-2016 (25x)http://google.de/url?sa=t&rct=j&q=
201307-07 (5x)http://google.de/url?sa=t&rct=j&q=linux+multiplizieren
201201-01 (4x)http://google.de/url?sa=t&rct=j&q=shell mutiplikation

[Top of page]

"Werkzeuge: Programmierung mit der Shell unter Linux" | 2 Comments
The authors of the comments are responsible for the content.

Re: Programmierung mit der Shell unter Linux
von: cow_gone_mad am: Fr. 13. April 2007 21:41:28
\(\begingroup\)Hallo Javaguru 😄 Das was du da bei grep beschreibst, sind doch reguläre Ausdrücke (http://de.wikipedia.org/wiki/Regul%C3%A4rer_Ausdruck), oder? 😵 Wenn ja, wäre es vielleicht für Leute die mehr drüber wissen wollen, gut das zu erwähnen. Liebe Grüsse, cow_ \(\endgroup\)
 

Re: Programmierung mit der Shell unter Linux
von: Ex_Mitglied_40174 am: Sa. 14. April 2007 15:14:09
\(\begingroup\)@cgm: Ja, "klassische" oder "obsolete" regexp, vgl. man 7 regex.\(\endgroup\)
 

 
All logos and trademarks in this site are property of their respective owner. The comments are property of their posters, all the rest © 2001-2022 by Matroids Matheplanet
This web site was originally made with PHP-Nuke, a former web portal system written in PHP that seems no longer to be maintained nor supported. PHP-Nuke is Free Software released under the GNU/GPL license.
Ich distanziere mich von rechtswidrigen oder anstößigen Inhalten, die sich trotz aufmerksamer Prüfung hinter hier verwendeten Links verbergen mögen.
Lesen Sie die Nutzungsbedingungen, die Distanzierung, die Datenschutzerklärung und das Impressum.
[Seitenanfang]