Shell Scripts csh (C-Shell)

  1. Vorbemerkung
  2. Allgemeines zu Shell Scripts
  3. Aufruf
  4. Einfaches Beispiel
  5. Testen eines Shell-Scripts
  6. Kommandozeilen-Parameter
  7. Prozeßsteuerung
    1. Bedingte Ausführung: if
    2. Mehrfachentscheidung: switch
    3. Schleife: foreach
    4. Schleife: while
  8. Literatur

Vorbemerkung

Shell-Scripts (Kommandoprozeduren) sind unter Unix das Analogon zu Batch-Dateien (Stapeldateien) von MS-DOS, sie sind jedoch wesentlich leistungsfähiger. Ihre Syntax hängt allerdings von der verwendeten "Shell" ab. In diesem Artikel werden C-Shell (csh) Scripts betrachtet. Im wesentlichen die gleiche Syntax findet man bei tcsh Scripts, während Bourne Shell (sh) Scripts eine andere Syntax aufweisen.

Allgemeines zu Shell Scripts

Ein Shell-Script ist eine Textdatei, in der Kommandos gespeichert sind. Es stellt selbst ein Kommando dar und kann wie ein Systemkommando auch mit Parametern aufgerufen werden. Shell-Scripts dienen der Arbeitserleichterung und (nach ausreichenden Tests) der Erhöhung der Zuverlässigkeit, da sie gestatten, häufig gebrauchte Sequenzen von Kommandos zusammenzufassen.

Aufruf

C-Shell Scripts lassen sich generell wie folgt aufrufen:

csh myscript

Im allgemeinen ist es aber praktischer, die Datei als ausführbar anzumelden (execute permission), mittels

chmod +x myscript

Das Shell-Script läßt sich dann wie ein "normales" (binäres) Kommando aufrufen:

myscript

Vorausgesetzt ist hierbei allerdings, daß das Betriebssystem das Script mit der richtigen Shell abarbeitet. Moderne Unix-Systeme prüfen zu diesem Zweck die erste Zeile. Für die csh sollte sie folgenden Inhalt haben:

#!/bin/csh

und für die tcsh entsprechend:

#!/bin/tcsh

Obwohl das Doppelkreuz normalerweise einen Kommentar einleitet, der vom System nicht weiter beachtet wird, erkennt es hier, daß die "csh" (mit absoluter Pfadangabe: /bin/csh) bzw. die "tcsh" eingesetzt werden soll.

Einfaches Beispiel

#!/bin/csh
# Einfaches Beispiel
echo Hallo, Welt!
echo Datum, Uhrzeit und Arbeitsverzeichnis:
date
pwd
echo Uebergabe-Parameter: $*

Das vorstehende einfache Script enthält im wesentlichen normale Unix-Kommandos. Abgesehen von der ersten Zeile liegt die einzige Besonderheit im Platzhalter "$*", der für alle Kommandozeilen-Parameter steht.

Testen eines Shell-Scripts

csh -n myscript
Syntax-Test (die Kommandos werden gelesen und geprüft, aber nicht ausgeführt)
csh -v myscript
Ausgabe der Shell-Kommandos in der gelesenen Form
csh -x myscript
Ausgabe der Shell-Kommandos nach Durchführung aller Ersetzungen, also in der Form, wie sie ausgeführt werden

Kommandozeilen-Parameter

$0
Name der Kommandoprozedur, die gerade ausgeführt wird
$#argv
Anzahl der Parameter
$1 $2 $3 ...
erster, zweiter, dritter ... Parameter
$*
$argv
steht für alle Kommandozeilen-Parameter ($1 $2 $3 ...)
$$
Prozeßnummer der Shell (nützlich, um eindeutige Namen für temporäre Dateien zu vergeben)
$status
gibt den Return-Code des zuletzt ausgeführten Kommandos an (0 bei erfolgreicher Ausführung)
$!
Prozeßnummer des zuletzt ausgeführten Hintergrund-Prozesses

Beispiel:

#!/bin/csh
# Variablen
echo Uebergabeparameter: $*
echo user ist: $USER
echo shell ist: $SHELL
echo Parameter 1 ist: $1
echo Prozedurname ist: $0
echo Prozessnummer ist: $$
echo Anzahl der Parameter ist: $#argv
set a = 17.89    # mit oder ohne Luecken am = Zeichen
echo a ist $a

Prozeßsteuerung

Bedingte Ausführung: if

if ( bedingung ) then
    kommandos1
  else kommandos2
endif

Anmerkungen: Die "bedingung" kann Operatoren enthalten, wie sie in der Programmiersprache C gebräuchlich sind. Im if-Konstrukt kann der "else"-Zweig entfallen, andererseits ist eine Erweiterung durch einen oder mehrere "else if"-Zweige möglich:

if ( bedingung1 ) then
    kommandos1
  else if ( bedingung2 ) then
    kommandos2
  else kommandos3
endif

Anstelle des Block-if mit der ersten Zeile
if ( bedingung ) then
ist in einfachen Fällen auch eine einzeilige Formulierung möglich,
if ( bedingung ) kommando
Alternativ ist es möglich, den Erfolg eines Kommandos zu prüfen:
if ( { kommando1 } ) kommando2
statt dessen könnte man auch formulieren
kommando1 && kommando2
bzw. anstelle von
if ( ! { kommando1 } ) kommando2
kommando1 || kommando2

Wichtige Vergleichsoperationen

Hinweis: Es ist unbedingt notwendig, daß alle Operatoren von Leerzeichen umgeben sind, sonst werden sie von der Shell nicht erkannt!
Zeichenketten
"s1" == "s2"
wahr, wenn die Zeichenketten gleich sind
"s1" != "s2"
wahr, wenn die Zeichenketten ungleich sind
(Ganze) Zahlen
n1 == n2
wahr, wenn die Zahlen gleich sind
n1 != n2
wahr, wenn die Zahlen ungleich sind
n1 > n2
wahr, wenn die Zahl n1 größer ist als n2
n1 >= n2
wahr, wenn die Zahl n1 größer oder gleich n2 ist
n1 < n2
wahr, wenn die Zahl n1 kleiner ist als n2
n1 <= n2
wahr, wenn die Zahl n1 kleiner oder gleich n2 ist
Sonstiges
!
Negation
&&
logisches "und"
||
logisches "oder" (nichtexklusiv; && hat eine höhere Priorität)
( ... )
Runde Klammern dienen zur Gruppierung.
-f filename
wahr, wenn die Datei existiert. (Weitere Optionen findet man in der man page zu csh)

Beispiel:

#!/bin/csh
# Interaktive Eingabe, if-Abfrage
echo "Hallo, user, alles in Ordnung?"
echo Ihre Antwort, n/j:
set answer=($<)
echo Ihre Antwort war: $answer
# if ( $answer == "j" ) then
if ( $answer != "n" ) then
  echo ja
else
  echo nein
endif

Mehrfachentscheidung: switch

switch ( var )
  muster1:
    kommandos1
    breaksw
  muster2:
    kommandos2
    breaksw
  default:
    default-kommandos
endsw
Anmerkungen: Die einzelnen Fälle werden durch die Angabe eines Musters festgelegt, "muster:" (auf separater Zeile), und durch das Kommando "breaksw" abgeschlossen. Die Marke "default:" wirkt als "default", sie deckt alle verbleibenden Fälle ab; die Verwendung des default-Zweiges ist optional.

Beispiel:

#!/bin/csh
# Interaktive Eingabe, Mehrfachentscheidung (switch)
echo "Alles in Ordnung?"
echo Ihre Antwort:
set answer=($<)
echo Ihre Antwort war: $answer
switch ( $answer )
  case j*:
  case J*:
  case y*:
  case Y*:
    echo jawohl
    breaksw
  case n*:
  case N*:
    echo nein, ueberhaupt nicht!
    breaksw
  default:
    echo das war wohl nichts
endsw

Schleife: foreach

foreach i ( par1 par2 par3 ... )
  kommandos
end
Anmerkungen: Die foreach-Schleife in der C-Shell unterscheidet sich von der for-Schleife in üblichen Programmiersprachen dadurch, daß nicht automatisch eine Laufzahl erzeugt wird. Der Schleifenvariablen werden sukzessive die Parameter zugewiesen, die in den runden Klammern stehen.

Beispiel:

#!/bin/csh
# Schleifen: foreach
echo Uebergabeparameter: $*
foreach i ($*)
  echo Hier steht: $i
end

Schleife: while

while ( bedingung )
  kommandos
end
Anmerkung: Bei "while" erfolgt die Prüfung der Bedingung vor der Abarbeitung der Schleife. Die Regeln für die "bedingung" entsprechen den Ausführungen zu "if".)

Beispiel:

#!/bin/csh
# Schleifen: while
# mit Erzeugung einer Laufzahl
@ i=1
while ( $i <= 5 )
  echo $i
  @ i = $i + 1
end

Verwendete Literatur


Burkhard Kirste, 1994/01/19