next up previous
Next: Schleifen Up: shell Previous: Eingebaute und wichtige Kommandos

Unterabschnitte

Wenn, dann ...

Die Struktur von if-Abfragen sieht so aus:

    if cond1
    then tu_was
    [ elif cond2
      then tu_was_anderes ]
    [ else tu_noch_was ]
    fi
if [ "$allesok" ] ; then tu_irgendwas; fi ist äquivalent zu [ "$allesok" ] && tu_irgendwas oder [ ! "$allesok" ] || tu_irgendwas, das if ist aber langsamer, da es noch zusätzlich zum test ausgewertet werden muß. Da Klammern aller Arten schon zu anderen Zwecken benutzt werden, wird fi benutzt, um das Ende einer if-Klausel anzuzeigen. Mit elif kann man if-Klauseln ineinander verschachteln, muß die if-Klausel aber nur mit einem fi beenden!

  [britta@Wintermute shell]$ cat whichday
  set `date`
  if [ "$1" = "Sat" -o "$1" = "sun" ]
  then
    echo "Es ist Wochenende..."
  else
    echo "Heute ist $1."
    echo "Viel Spass beim Arbeiten!!!"
  fi
  [britta@Wintermute shell]$ whichday
  Es ist Wochenende...
  [britta@Wintermute shell] $cat sysname
  set `uname -a`
  os="$1"
  kernel="$3"
  shift 2
  cpu="$9" 
  if [ "$os" = "Linux" ]
  then
    echo Noch ein Linuxbenutzer! 
    echo netter Kernel, "$kernel"
  elif [ "$cpu" = "alpha" ]
  then
    echo Ich will auch einen alpha!
    echo Hast Du´s gut mit deinem "$os" ?
  else
    echo Also einen"$cpu" mit "$os" hast du!
    echo Gibt´s nicht schon einen neuere Version als "$kernel" ?
  fi
  [britta@Wintermute shell] $sysname
  Noch ein Linuxbenutzer!
  netter Kernel, 2.2.9

case

caseist ein mächtiges Konstrukt: es kann verschiedene Kommandos abhängig vom Wert einer Variable ausführen, ähnlich wie switch, case in C, allerdings benutzt es bei den verschiedenen Fällen das Pattern-Matching der Shell. Wenn man also String-Werte in den Bedingungen abfragt (z.B. bei Kommandozeilenparametern), ist case billiger (und auch lesbarer) als (u. U. verschachtelte) if-Zweige. Die Syntax ist folgendermaßen:

    case var in
      [ pat1 [ | pat2 ] ... ) tu_dies ;; ] ... 
    esac
Die letzte Zeile ist nicht nötig, aber immer gut, um nicht matchende Fälle aufzusammeln (default in C). An der Pattern-Stelle kann man mit *, ?, [...] die üblichen Shell-Wildcards benutzen.

  [britta@Wintermute shell]$ cat weekday
  #Deutsch/Englisch "portables" Wochentagsprogramm... :)
  set `date`
  case "$1" in
    Mon)     /usr/games/fortune ;;                #montags ein fortune
    Tue|Die) updatedb ;;                          #dienstags locate updaten
    Wed|Mit) mail -s "Heute ist Mittwoch" root ;; #Account gefaehrden...
    Thu|Don) echo "Bald ist Wochenende !!!" ;;    #Freude
    Fr[ei])  if [ "$3" -eq 13 ]                     #ist es der 13. ?
             then
               echo Heute ist Freitag der dreizehnte... viel Glueck!
            fi ;;
    *) echo "Wochenende!!!!" ;;                   #nix zu tun
  esac
  [britta@Wintermute shell]$ weekday
  Wochenende!!!!

next up previous
Next: Schleifen Up: shell Previous: Eingebaute und wichtige Kommandos
Britta Koch
1999-06-18