Informatik: Programmierung mit der Shell unter Linux
Released by matroid on Mo. 09. April 2007 11:40:23 [Statistics] [Comments]
Written by javaguru - 6126 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: \sourceonSHELL lxuser% echo "Hallo Welt" Hallo Welt lxuser% \sourceoff 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: \sourceonSHELL #!/bin/sh # Das ist ein Kommentar echo "Hallo Welt" \sourceoff 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. \sourceonSHELL lxuser% chmod 744 meine_datei.sh lxuser%./meine_datei.sh Hallo Welt lxuser% \sourceoff 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: \sourceonSHELL #!/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 \sourceoff Dieser kleine Codeabschnitt liefert die folgende Ausgabe: \sourceonSHELL $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 \sourceoff 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 \sourceonSHELL #!/bin/sh echo "Dies ist ein wahnsinnig langer, sinnfreier und \ unglaublich ueberfluessiger Satz." \sourceoff

    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 \sourceonSHELL #!/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 \sourceoff 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 \sourceonSHELL COMMAND Parameter1 Parameter2 ... \sourceoff 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. \sourceonSHELL #!/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 \sourceoff

    Bedingte Ausführung

    Wie in jeder Programmiersprache, können auch in der Shellprogrammierung Kommandos auch miteinander auf zwei verschiedenen Arten verknüpft werden. \sourceonSHELL COMMAND1 && COMMAND2 \sourceoff stellen eine logische UND-Verknüpfung dar. Wurde COMMAND1 fehlerfrei ausgefuehrt (exit status 0 heißt Abarbeitung ohne Fehler), wird auch COMMAND2 ausgeführt. \sourceonSHELL COMMAND1 || COMMAND2 \sourceoff 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: \sourceonSHELL if Liste then Liste [elif Liste then Liste...][else Liste] fi \sourceoff 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. \sourceonSHELL #!/bin/sh if grep Bash file.txt then echo "In der Datei ist das Wort Bash vorhanden." fi \sourceoff

    for ... do

    Syntax: \sourceonSHELL for Name [ in Wort ] do Liste done \sourceoff 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. \sourceonSHELL #! /bin/sh for planet in Mercury Venus Earth Mars Jupiter Saturn Uranus do echo $planet done \sourceoff oder auch \sourceonSHELL #! /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 \sourceoff

    while und until

    Syntax: \sourceonSHELL while Liste do Liste done \sourceoff Syntax: \sourceonSHELL until Liste do Liste done \sourceoff 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. \sourceonSHELL #!/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 \sourceoff

    case

    Syntax: \sourceonSHELL case Wort in [ Muster [ | Muster ]) Liste ;; ... ] esac \sourceoff 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. \sourceonSHELL #!/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 \sourceoff

    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 6126
     
    Aufrufstatistik des Artikels
    Insgesamt 54 externe Seitenaufrufe zwischen 2012.01 und 2022.11 [Anzeigen]
    DomainAnzahlProz
    http://google.de5194.4%94.4 %
    https://duckduckgo.com23.7%3.7 %
    https://google.com11.9%1.9 %

    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]



    von: am: Do. 01. Januar 1970 01:00:00
    \(\begingroup\) \(\endgroup\)
     
    "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!!! 😁 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-2023 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]