Informatik: Programmierung mit der Shell unter Linux
Released by matroid on Mo. 09. April 2007 11:40:23 [Statistics]
Written by javaguru - 6068 x read [Outline] Printable version Printer-friendly version -  Choose language   
Informatik

\(\begingroup\)




Bild

Einleitung



Was ist denn die Shell?
Shell ist die Benutzeroberfläche oder Benutzerschnittstelle eines Betriebssystems, die dessen Kern wie eine Hülle oder Schale umgibt. Daher kommt auch der Name Shell, was so viel wie Muschel heißt, denn die Shell umgibt den Kern wie eine Schale. Meist handelt es sich dabei um einen Befehlsinterpreter, der Tastaturkommandos entgegen nimmt.

Im folgenden die wichtigsten Vertreter:
  • sh, Bourne Shell, Die Mutter aller Shells

  • csh, C-Shell, Shell mit C-ähnlicher Syntax

  • ksh, Korn Shell, Mächtige, C-orientierte Shell (Solaris)

  • zsh, Z-Shell, Erweiterte, komfortableShell, Bash kompatibel

  • bash, Bourne Again SH, Erweiterte, komfortable Bourne Shell

  • Wir werden uns in diesem Artikel mit der Bash beschäftigen. Sie ist der Standard-Kommandointerpreter unter LINUX und UNIX.


    Die ersten Schritte



    Im Grunde ist ein Shellscript nichts anderes als eine Textdatei. In dieser Datei sind dann Befehlsfolgen enthalte. Diese Befehlsfolgen können mit Hilfe von Schleifen und Variablen gesteuert werden. Man kann solche Befehlsfolgen auch direkt in der Shell eingeben. Denkbar wäre zum Beispiel Folgendes:
    SHELL
    lxuser% echo "Hallo Welt"
    Hallo Welt
    lxuser%

    Man kann aber auch ein kleines Script schreibt, welches man jederzeit wieder aufrufen kann. Zu diesem Zwecke öffne man einen Editor seiner Wahl (vi, emacs, nedit, kwrite, ...) und gebe dort als Beispiel mal Folgendes ein:
    SHELL
    #!/bin/sh
    # Das ist ein Kommentar
    echo "Hallo Welt"

    Danach braucht man nur die Datei unter einem selbstgewählten Namen abspeichern. Die eigentliche Endung für ein Shellscript ist .sh. Die Datei macht man nun noch ausführbar. Danach kann das Script gestartet werden.
    SHELL
    lxuser% chmod 744 meine_datei.sh
    lxuser%./meine_datei.sh
    Hallo Welt
    lxuser%

    Eine Shell-Skript beginnt mit der Angabe des Kommandointerpreters. Zeile 1 ist also der Pfad zu dem Programm, das die folgenden Zeilen interpretieren kann. Hier wird auf die Bourne Shell (sh) verwiesen. Die Datei /bin/sh ist in unserem Fall ein Link auf die Bash.

    Kommentare werden zeilenweise mit # gekennzeichnet. Das Shellkommando echo existiert in zwei Formen. Zum einen ist es ein in der Shell enthaltendes Kommando, zum anderen ist es aber auch eine Datei, welche sich im Verzeichnis /bin befindet. Linux bietet eine Vielzahl von Tools und Kommandos, die das Arbeiten auf der Textkonsole ermöglichen und erleichern.

    Variablen



    Wie in jeder Programmiersprache gibt es auch in der Shell Variablen. Die Bash unterscheidet bei Variablen nicht nach Typen. Grundsätzlich wird jede Variable erst einmal als String aufgefasst. Je nach Kontext kann sie dann auch als Integer interpretiert werden, wie man dem folgeden Beispiel entnehmen kann.

    Hier nun einige Beispiele, die den Umgang erlaeutern sollen:
    SHELL
    #!/bin/sh
    # Wertzuweisung
    Variable_1=10
    Variable_2="Der Mond ist rund."
    Variable_3="1 2  3    4"
    Variable_4=$(hostname)
     
    # Wertabfrage
    echo \$Variable_1 = $Variable_1
    echo "\$Variable_2 = $Variable_2"
    echo '$Variable_1 + $Variable_2' = ${Variable_1}${Variable_2}
    echo $Variable_3
    echo "$Variable_3"
    echo $Variable_4

    Dieser kleine Codeabschnitt liefert die folgende Ausgabe:
    SHELL
    $Variable_1 = 10
    $Variable_2 = Der Mond ist rund.
    $Variable_1 + $Variable_2 = 10Der Mond ist ein gruener Kaese.
    1 2 3 4
    1 2  3   4
    lxuser

    In Zeile 7 wird die Shell angewiesen, erst den rechten Teil der Variablenzuweisung auszufuehren, nämlich den Befehl hostname. Dies wird durch $(...) erreicht. Die Variable wird also mit dem Hostnamen des jeweiligen Rechners belegt.

    Zu lange Befehlszeilen können mit einem \ getrennt werden, wie man dem folgenden Beispiel entnehmen kann
    SHELL
    #!/bin/sh
    echo "Dies ist ein wahnsinnig langer, sinnfreier und \
      unglaublich ueberfluessiger Satz."


    Spezielle Typen von Variablen



    local variables
    Diese sind nur innerhalb eines Code Blocks ({...}) oder einer Funktion gültig und werden mit local Variablename definiert.
    environmental variables
    Sie bestimmen das Erscheinungsbild der Shell und dienen der Anpassung ihres Verhaltens in der Systemumgebung. Die Prozessumgebung wird vom Elternprozess an seine Kinder vererbt. D.h. alle Umgebungsvariablen der Bash werden an die von ihr gestarteten Prozesse weitergegeben. Die Kommandos printenv und export geben alle Umgebungsvariablen aus. Mit dem set-Kommando können Umgebungsvariablen gesetzt werden.

    Arrays



    Die Bash unterstuetzen auch eindimensionale Arrays. Diese können mit declare -a Variablenname initialisiert werden, müssen es aber nicht. Einzelnen Elemente des Arrays werden mit ${variable[xx]} angesprochen. Auch hierzu ein kleines Codebeispiel
    SHELL
    #!/bin/bash
    array=( eins zwei drei vier fuenf sechs)
    array[6]="Dieser Text ist ein Element des Arrays."
     
    echo ${array[0]}                # eins
    echo ${array[1]}                # zwei
    echo ${array:0}                 # eins
    echo ${array:1}                 # ins
    echo ${array[1]:1}              # wei
    echo ${#array[2]}               # 4
    element_count=${#array[@]}
    echo $element_count              # 7

    Als Kommentar habe ich bereits die Ausgaben mit angegeben. Daher verzichte ich hier darauf noch einmal die Ausgaben beim Ausführen des Scriptes aufzuschreiben.

    Positionsparameter



    Einem Shellscript können beim Aufruf auch Parameter mitgegeben werden. Der Aufruf erfolgt dann über dieses Kommando
    SHELL
    COMMAND Parameter1 Parameter2 ...

    Diese Parameter lassen sich im Script mit $1, $2, ... abfragen. Ab dem 10. übergebenen Parameter müssen jedoch geschweifte Klammern gesetzt werden. Das ganze sieht dann so aus: ${10}.

    Mit dem shift-Kommando ist es möglich, die Positionsparameter nach links zu verschieben. Das bedeutet, dass der zweite Parameter der Erste wird, der Dritte der Zweite usw.. $0 (der Scriptname) bleibt unberührt. Dieses Kommando macht zum Beispiel bei Funktionen Sinn, wie bei dieser folgenden Beispiel. Die Ausgabe ist wieder mit angegeben und noch einige erläuternde Kommentare.
    SHELL
    #!/bin/bash
    multiply ()           # multipliziert die uebergebenen Parameter
    {                     # Anzahl der Parameter ist variabel
      local product=1
      until [ -z "$1" ]   # Until nutzt den ersten uebergebenen Parameter ...
      do
      let "product *= $1"
      shift
      done
      echo $product         #  wird nicht auf STDOUT ausgegeben,
    }                       #  wenn es an eine Variable uebergeben wird
     
    mult1=15383; mult2=25211
    val1=`multiply $mult1 $mult2`
    echo "$mult1 X $mult2 = $val1" # 387820813


    Bedingte Ausführung



    Wie in jeder Programmiersprache, können auch in der Shellprogrammierung Kommandos auch miteinander auf zwei verschiedenen Arten verknüpft werden.
    SHELL
    COMMAND1 && COMMAND2
    stellen eine logische UND-Verknüpfung dar. Wurde COMMAND1 fehlerfrei ausgefuehrt (exit status 0 heißt Abarbeitung ohne Fehler), wird auch COMMAND2 ausgeführt.
    SHELL
    COMMAND1 || COMMAND2
    stellen eine logische ODER-Verknüpfung dar. COMMAND2 wird nur ausgeführt, wenn bei COMMAND1 ein Fehler aufgetreten ist.

    Verzweigungen und Schleifen



    if ... then



    Syntax:
    SHELL
    if Liste then Liste [elif Liste then Liste...][else Liste] fi 

    if ... then Konstruktionen überprüfen, ob der Exit-Status einer Liste von Kommandos den Wert 0 besitzt. Ist dieses der Fall, werden weitere, entsprechend definierte, Kommandos ausgeführt.

    Im folgenden Beispiel wird mit dem Kommando grep in einer Textdatei nach Zeilen, die das Wort "Bash" enthalten, gesucht. Existieren solche Zeilen, gibt grep als Exit-Status 0 (= true) aus. Das bedeutet, das folgende Kommando wird ausgeführt.
    SHELL
    #!/bin/sh
    if grep Bash file.txt
    then echo "In der Datei ist das Wort Bash vorhanden."
    fi


    for ... do



    Syntax:
    SHELL
    for Name [ in Wort ] do Liste done 

    Mit Name wird eine Shellvariable definiert, die in jedem Schleifendurchlauf einen neuen Wert erhält. Die Werte werden normalerweise mit dem Schlüsselwort in übergeben. Wird der Teil in Wort weggelassen, wird die Liste für jeden gesetzten Parameter einmal ausgeführt.
    SHELL
    #! /bin/sh
    for planet in Mercury Venus Earth Mars Jupiter Saturn Uranus
    do
      echo $planet
    done

    oder auch
    SHELL
    #! /bin/sh
    NUMBERS="9 7 3 8 37.53"
    for number in `echo $NUMBERS`  # for number in 9 7 3 8 37.53
    do
      echo "$number "
    done


    while und until



    Syntax:
    SHELL
    while Liste do Liste done

    Syntax:
    SHELL
    until Liste do Liste done 

    Der Schleifenkörper do Liste done wird so lange wiederholt, bis die in while Liste formulierte Bedingung falsch ist.

    Die until-Schleife entspricht der while-Schleife mit dem Unterschied, dass der do-Teil so lange ausgeführt wird, wie das letzte Kommando der until Liste einen Status ungleich 0 liefert.
    SHELL
    #!/bin/sh
    var0=0
    LIMIT=10
     
    while [ "$var0" -lt "$LIMIT" ]
    do
      echo -n "$var0 "        # -n suppresses newline.
      var0=`expr $var0 + 1`   # var0=$(($var0+1)) also works.
    done


    case



    Syntax:
    SHELL
    case Wort in [ Muster [ | Muster ]) Liste ;; ... ] esac 

    Mit der case-Anweisung können Verzweigungen programmiert werden. Wort wird mit den angegebenen Mustern verglichen. Bei Übereinstimmung wird die Liste von Kommandos ausgeführt. In den Suchmustern können auch Wildcards und reguläre Ausdrücke verwendet werden.
    SHELL
    #!/bin/sh
    arch=$1
    case $arch in
      i386 ) echo "80386-based machine";;
      i486 ) echo "80486-based machine";;
      i586 ) echo "Pentium-based machine";;
      i686 ) echo "Pentium2+-based machine";;
      *    ) echo "Other type of machine";;
    esac


    Abschluss



    Das soll es nun erstmal gewesen sein. Allerdings ist bereits ein zweiter Teil in Arbeit, der dann noch die folgenden Oberthemen behandeln wird:

  • Arithmetik

  • Funktionen

  • Ein-/Ausgabe-Umleitungen

  • Pipes

  • und noch einiges mehr





  • Zur Fortsetzung >>> Teil 2
    \(\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 :: Programmierung :
    Programmierung mit der Shell unter Linux [von javaguru]  
    Programmierung mit Skripten unter der Linux- und Unix-Shell sh bzw. bash.
    [Die Arbeitsgruppe Alexandria katalogisiert die Artikel auf dem Matheplaneten]

     
     
    Aufrufzähler 6068
     
    Aufrufstatistik des Artikels
    Insgesamt 51 externe Seitenaufrufe zwischen 2012.01 und 2019.03 [Anzeigen]
    DomainAnzahlProz
    http://google.de51100%100 %

    Häufige Aufrufer in früheren Monaten
    Insgesamt 37 häufige Aufrufer [Anzeigen]
    DatumAufrufer-URL
    2013-2017 (20x)http://google.de/url?sa=t&rct=j&q=
    201205-05 (7x)http://google.de/url?sa=t&rct=j&q=shell script variablenzuweisun g
    201306-06 (5x)http://google.de/url?sa=t&rct=j&q=shell programmierung potenzen
    201203-03 (5x)http://google.de/url?sa=t&rct=j&q=shell sh potenzen

    [Top of page]

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

    Re: Programmierung mit der Shell unter Linux
    von: cow_gone_mad am: Mo. 09. April 2007 22:16:46
    \(\begingroup\)
    Hallo javaguru :-)

    Ich freue mich auf die Fortsetzung. ;-)

    Ich finde übrigens BASH Syntax ein Meisterwerk. Paare wie "case" - "esac" und "if" - "fi" sind einfach cool! Leider wird dies nicht durchgehalten "do" - "od" wäre zum Beispiel noch cool!!! :-D

    Liebe Grüsse,
    cow_
    \(\endgroup\)
     

    Re: Programmierung mit der Shell unter Linux
    von: gilgamash am: Fr. 13. April 2007 17:23:39
    \(\begingroup\)
    Du solltest unbedingt erwähnen, wie wichtig es ist, dass Ausdrücke in eckigen Klammern [ xxx ] durch ein Freizeichen getrennt werden müssen! Das hat schon viele Leute Stunden der Verzweiflung gekostet :-)
    G.
    \(\endgroup\)
     

    Re: Programmierung mit der Shell unter Linux
    von: davidhigh am: Di. 04. September 2007 16:13:58
    \(\begingroup\)
    Der Artikel hat mir gerade sehr geholfen. danke !\(\endgroup\)
     

    Re: Programmierung mit der Shell unter Linux
    von: rlk am: Mo. 14. Januar 2008 20:09:46
    \(\begingroup\)
    Hallo Javaguru,
    schön, dass Du Dich nicht darauf beschränkst, Java zu erklären ;-)

    Im Kapitel "Variablen" beziehst Du Dich auf Zeile 7, da wären Zeilennummern vielleicht hilfreich (ich glaube, Du meinst Zeile 6):
    Variable_4=$(hostname)
    Die Tatsache, dass hostname ein Programm ist, dessen Ausgabe den Wert von Variable_4 bestimmt geht ein bisschen unter, vielleicht solltest Du das mehr betonen, besonders weil es syntaktisch sehr ähnlich zum Auswerten einer Variablen ${HOME} ist?

    @cow: das Schlüsselwort od war leider schon durch das Programm (octal dump) mit demselben Namen belegt, daher konnte das Konzept der Palindrome als Endbezeichner nicht durchgehalten werden.
    Ich frage mich manchmal, wie Unix aussähe, wenn damals schon Basis 16 statt Oktal üblich gewesen wäre...

    Roland\(\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-2021 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]