Die Mathe-Redaktion - 23.11.2017 23:10 - Registrieren/Login
Auswahl
Schwarzes Brett
Aktion im Forum
Suche
Stichwortsuche in Artikeln und Links von Matheplanet
Suchen im Forum
Suchtipps

Bücher
Englische Bücher
Software
Suchbegriffe:
Mathematik bei amazon
Naturwissenschaft & Technik
In Partnerschaft mit Amazon.de
Kontakt
Mail an Matroid
[Keine Übungsaufgaben!]
Impressum

Bitte beachten Sie unsere Nutzungsbedingungen, die Distanzierung, unsere Datenschutzerklärung und
die Forumregeln.

Sie können Mitglied werden oder den Newsletter bestellen.

Der Newsletter Okt. 2017

Für Mitglieder
Mathematisch für Anfänger
Wer ist Online
Aktuell sind 528 Gäste und 14 Mitglieder online.

Sie können Mitglied werden:
Klick hier.

Über Matheplanet
 
Werkzeuge: Programmierung mit der Shell unter Linux
Freigegeben von matroid am Do. 12. April 2007 22:55:58
Verfasst von javaguru -   3911 x gelesen [Gliederung] [Statistik] Druckbare Version Druckerfreundliche Version
Informatik





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.
SHELL
#!/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

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:
SHELL
+ -        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

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.
SHELL
#! /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

Ein-/Ausgabe-Umleitungen



Jedes Programm erhält beim Start drei offene "Datenkanäle":
SHELL
Standard Input:         STDIN  (0)
Standard Output:        STDOUT (1)
Standard Error Output:  STDERR (2)

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:
SHELL
COMMAND<infile       Eingabeumlenkung
COMMAND>outfile      Ausgabeumlenkung
COMMAND»outfile      Ausgabeumlenkung, anhängen
COMMAND 2>&1         STDERR mit auf STDOUT legen

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.
SHELL
lxuser% cat text.txt|grep -i Mathe
export Mathe=1000

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
SHELL
grep [-CVbchilnsvwx] [-Anzahl] [-AB Anzahl] [[-e] Ausdruck | -f Datei] [Datei...]

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.
SHELL
ls | grep Name.ext
listet auch Dateie mit dem Namen Name0ext , NameBext , usw. auf. .
SHELL
ls | grep Name\.ext
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
SHELL
grep "Fred\(ericke\)\? Feuerstein" textfile

Die Klammern bilden eine Gruppe. Das Fragezeichen bedeutet ein oder kein Vorkommen des vorherigen Musters.

Hier werden Klammern innerhalb anderer Klammern ausgeschlossen:
SHELL
grep "([^()]*)"
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.)
SHELL
grep "[0-9]\{4\}[ -]\?[0-9]\{6\}" file
[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
SHELL
grep "^[[:space:]]*Hallo[[:space:]]*$" file
^ 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
SHELL
grep "Ich mag den \(HSV\|FC Bayern München\) sehr gerne." file
\| 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

Link auf diesen Artikel Link auf diesen Artikel  Druckbare Version Druckerfreundliche Version  Einen Freund auf diesen Artikel aufmerksam machen Weitersagen Kommentare zeigen Kommentare  
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]

 
Verwandte Links
 
Besucherzähler 3911
 
Aufrufstatistik des Artikels
Insgesamt 51 externe Besuche in 2015 [Anzeigen]
DomainAnzahlProz
http://google.de4894.1%94.1 %
http://google.com23.9%3.9 %
http://google.at12%2 %

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=
2013.07 (5x)http://google.de/url?sa=t&rct=j&q=linux+multiplizieren
2012.01 (4x)http://google.de/url?sa=t&rct=j&q=shell mutiplikation

[Seitenanfang]

" Werkzeuge: Programmierung mit der Shell unter Linux" | 2 Kommentare
 
Für den Inhalt der Kommentare sind die Verfasser verantwortlich.

Re: Programmierung mit der Shell unter Linux
von cow_gone_mad am Fr. 13. April 2007 21:41:28


Hallo Javaguru smile

Das was du da bei grep beschreibst, sind doch reguläre Ausdrücke (de.wikipedia.org/wiki/Regul%C3%A4rer_Ausdruck), oder?  confused

Wenn ja, wäre es vielleicht für Leute die mehr drüber wissen wollen, gut das zu erwähnen.

Liebe Grüsse,
cow_

 [Bearbeiten]

Re: Programmierung mit der Shell unter Linux
von Ex_Mitglied_40174 am Sa. 14. April 2007 15:14:09


@cgm: Ja, "klassische" oder "obsolete" regexp, vgl. man 7 regex.

 [Bearbeiten]

 
All logos and trademarks in this site are property of their respective owner. The comments are property of their posters, all the rest © 2001-2017 by Matroids Matheplanet
This web site was made with PHP-Nuke, a web portal system written in PHP. 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]