Springe zum Hauptinhalt

Archiv
next up previous contents
Next: Ablaufsteuerung Up: Bourne-Shell als Kommando- und Previous: Argumentübergabe beim Aufruf eines

Shell-Variablen

  • Shell-Variablen speichern Zeichenketten. Namen von Shell-Variablen müssen mit einem Buchstaben beginnen, dem Buchstaben, Ziffern und Unterstreichungszeichen folgen können. Die Zuweisung eines Zeichenkettenwertes geschieht folgendermaßen


    $ varname=zeichenkette


    Beispiel:

    $ farbe=blau
    $ vorname=Hans
    
    Bemerkung:

    Variable werden durch ihre Verwendung (Nennung des Namens) definiert, sie besitzen standardmäßig den Wert der leeren Zeichenkette.

  • Wenn die zuzuweisende Zeichenkette Leerzeichen, Tabulatorzeichen oder Newlinezeichen enthält, so muß die Zeichenkette markiert werden, z.B.
    $ name="ANTON ADLER"
    $ name=ANTON\ ADLER
    $ name='ANTON ADLER'
    
    Bemerkung: Markierungsmechanismen der Shell werden noch genauer erläutert
  • Eine Variable kann mit dem Attribut ,,Nur lesen`` versehen werden, so daß ihr Wert nicht mehr verändert werden kann, z.B.
    $ einrichtung="Fachbereich Informatik"
    $ readonly einrichtung
    
  • Shell-Variable besitzen einen definierten Gültigkeitsbereich, sie sind standardmäßig lokal bezüglich des aktuellen Shell-Prozesses. Eine Erweiterung des Gültigkeitsbereiches auf untergeordnete Shell-Instanzen (Kindprozesse) ist über das export -Kommando möglich, z.B.
    $ export einrichtung
    
    Bemerkung: export ohne Argument liefert eine Liste der exportierten Variablen
  • Der Zugriff auf den aktuellen Wert einer Variablen geschieht dadurch, daß vor den Variablenname das Zeichen $ gesetzt wird, z.B.:
    $einrichtung
    $farbe
    
    somit liefert
    $ echo $einrichtung
    Fachbereich Informatik
    
    während echo für eine Variable, der noch kein Wert zugewiesen wurde, nichts liefert:
    $ echo $xyz
    $
    
    Der Wert einer exportierten Variablen kann in einer Sub-Shell nur lokal verändert werden.
    Beispiel:
    $ trainer=ANTON\ ADLER
    $ echo $trainer
    ANTON ADLER
    $ export trainer
    $ sh
    $ echo $trainer
    ANTON ADLER
    $ trainer=BERND\ BIBER
    $ echo $trainer
    BERND BIBER
    $ exit
    $ echo $trainer
    ANTON ADLER
    $
    
  • Mit dem Kommando unset kann eine Variablendefinition rückgängig gemacht werden, z.B.
    $ unset trainer
    
  • Wenn der Wert einer Variablen mit einer nicht dazugehörigen Zeichenfolge verkettet werden soll, so muß der Variablenname in geschweiften Klammern eingeschlossen werden, z.B.
    $ jahreszeit=Winter
    $ echo ${jahreszeit}ferien
    Winterferien
    $ file=prog
    $ echo ${file}.c
    prog.c
    
  • Spezielle Ersetzungsmechanismen für Shell-Variable
    ${name:-wort} ersetzt name durch seinen Wert,
      falls dieser ungleich Null ist, ansonsten
      wird wort eingesetzt
    ${name:=wort} ersetzt name durch seinen Wert,
      falls dieser ungleich Null ist, andernfalls
      wird wort eingesetzt und name zugewiesen.
    ${name:?wort} ersetzt name durch seinen Wert,
      falls dieser ungleich Null ist, andernfalls
      wird wort auf der Standardfehlerausgabe
      ausgegeben und das Script abgebrochen.
    ${name:+wort} Setzt den Wert wort ein, falls name
      ungleich Null ist, ansonsten wird nichts ersetzt.
  • Shell-Variablen werden oft verwendet, um den Dialog am Terminal zu erleichtern, d.h. den ,,Tippaufwand`` zu reduzieren, indem z.B. für Pfadnamen Synonyme eingeführt werden:
    $ dir=/afs/tu-chemnitz.de/home/urz/s/stb
    $ ls $dir
    $ ls $dir/*.c
    
    Falls z.B. /afs/tu-chemnitz.de/home/urz/s/stb/cmd ein Shell-Script enthält, so ist der Aufruf auch einfach möglich
    $ $dir/cmd ...
    
  • Folgende spezielle Shell-Variablen besitzen einen von der Shell vordefinierten Wert:
    # Anzahl der Argumente, die dem Shell-Script übergeben wurden (bzw. 
      Anzahl der mittels set gesetzten Shell-Variablen i (Werte $1, $2, ...)
    * Bezugnahme auf alle Argumentwerte $1, $2, etc.
      (z.B. beim Aufruf des Shell-Scripts)
    @ analog wie $*; die Angabe ,,$@`` bezieht sich auf alle Variablen
      ,,$1``, ,,$2`` etc.
      Name des aktuell ausgeführten Shell-Scripts
    - Optionen dieser Shell
    ? Exitstatus (Return value) des letzten Kommandos
    $ Prozessnummer der Shell
    ! Prozessnummer des letzten Kommandos mit &
    IFS Liste von Worttrennzeichen in Argument
    MAIL File, das bei Änderung ,,you have mail``- Meldung bewirkt
    PS1 Primäre Prompt-Zeichenkette; Voreinstellung '$\$$'
    PS2 Sekundäre Prompt-Zeichenkette; Voreinstellung '>'
  • Die folgenden speziellen Shell-Variablen sind nicht automatisch gesetzt; ihre Werte werden gewöhnlich beim Sitzungsbeginn festgelegt (die Wertzuweisungen sind dabei im File $HOME/.profile enthalten). Sie können jedoch wie ,,normale`` Variablen modifiziert werden.
    HOME Standardargument für das cd- Kommando (HOME-Verzeichnis, für jeden Nutzer im Passwordfile /etc/passwd festgelegt)
    PATH Suchpfade für Kommandos, d.h. Reihenfolge der Verzeichnisse, in denen nach den Programmen bzw. Shell-Scripts gesucht werden soll. Die einzelnen Verzeichnisse sind durch das Zeichen : voneinander getrennt (p1:p2:p3:...:pn)
  • Beispiele:
    $ echo $PATH
    /bin:/usr/bin/:           #  1. /bin
                              #  2. /usr/bin
                              #  3. aktuelles Verzeichnis
    
    $ PATH=:/bin:/usr/bin:$HOME/bin
                              #  Suchreihenfolge:
                              # 1. aktuelles Verzeichnis
                              # 2. /bin
                              # 3. /usr/bin
                              # 4. Verzeichnis bin im Homeverzeichnis
    
    $ PATH=/bin::/usr/bin
                              # Suchreihenfolge:
                              # 1. /bin
                              # 2. aktuelles Verzeichnis
                              # 3. /usr/bin
    
  • Bemerkung:
    • Privatversionen von ,,Systemprogrammen``
    • Suchreihenfolge $\Leftrightarrow$ Antwortzeitverhalten
    PS1 Festlegung der Promptzeichenkette der Shell, standardmäßig $

    Beispiel: PS1=``Sie wünschen:''

    PS2 Promptzeichenkette bei Folgeeingaben, standardmäßig >

    Beispiel: $echo 'Hallo >wie geht's?'

    IFS Separatorzeichen der Shell, standardmäßig Leerzeichen, Tabulator- und Newlinezeichen
    MAIL Name des Nachrichtenfiles des Nutzers; er wird benachrichtet, wenn Nachrichten in dem File eingetroffen sind
  • Kommandosubstitution


    `cmd` $\Rightarrow$ wird ersetzt durch die Standardausgabe von cmd

    • Beispiel:
      $ date       # Uhrzeit, Datum
      Don Mär 16 11:18:58 MET 2000
      
      $ echo Aktuelles Datum und Uhrzeit: `date` 
      Aktuelles Datum und Uhrzeit: Don Mär 16 11:19:59 MET 2000
      $
      $ pwd 
      /afs/tu-chemnitz.de/home/urz/s/stb
      $ dir=`pwd` 
      $ echo $dir 
      /afs/tu-chemnitz.de/home/urz/s/stb
      
  • Textsubstitution und Markierungsmöglichkeiten (quoting)
    • Die Shell führt Substitutionen in folgender Reihenfolge durch:
      1.
      Variablensubstitution


      alle mit $ beginnenden Worte werden ersetzt durch ihren Zeichenkettenwert

      2.
      Kommandosubstitution


      `cmd` $\Rightarrow$ wird ersetzt durch Standardausgabe von cmd

      3.
      Leerzeichen-, Tabulator-, Newline-Interpretation


      Das nach 1. und 2. entstehende Ergebnis wird nach Trennzeichen durchsucht und die entsprechende Separierung durchgeführt (Ausnahmen: Trennzeichen in markierten Worten)

      4.
      Filenamengenerierung


      Auswertung der Metazeichen *, ?, [-]

    • Markierungsmechanismen (quoting) dienen dazu, die Sonderbedeutung von Metazeichen aufzuheben
      1.
      $\backslash$z hebt die (eventuelle) Sonderbedeutung von z auf
      2.
      In Apostrophe eingeschlossene Texte ('...' ) werden keinerlei Textsubstitution unterworfen. Das Zeichen ' darf in diesem Text nicht enthalten sein.
      3.
      Bei in Anführungszeichen (``...'') eingeschlossenen Texten ist die Sonderbedeutung der Metazeichen außer $\backslash$, `, `` und $ aufgehoben, d.h. die Shell führt Kommando- und Variablensubstituion durch.
    • Beispiel:
      $ echo "heute ist `date`; HOME-Verzeichnis: $HOME"
      heute ist Don Mär 16 11:21:40 MET 2000; HOME-Verzeichnis: /afs/tu-chemnitz.de/home/urz/s/stb
      $ echo "1 \$ = 1.95 DM"
      1 $ = 1.95 DM
      $
      

next up previous contents
Next: Ablaufsteuerung Up: Bourne-Shell als Kommando- und Previous: Argumentübergabe beim Aufruf eines