next | next | up | down | Inhalt | Uebungen | Complete | Kommentar

all, section 7.3.

7.3.  cal

Kernighan und Pike führen vor, daß man einem Kommando wie cal eine elegantere Benutzeroberfläche geben kann:

 1      #!/bin/sh       
 2      PATH=/usr/ucb:/bin:/usr/bin     # sonst rekursiv...
 3      
 4      case $#
 5      in 0)
 6        set `date`; m=$2; eval y=\$$# # cal   heute
 7      ;; 1)
 8        m=$1; set `date`; eval y=\$$# # cal x Monat x im Jahr
 9      ;; *)
10        m=$1; y=$2    # cal x y       Monat x im Jahr y
11      esac
12      
13      case $m
14      in [1-9] | 1[0-2])              # Monatszahl
15      ;; [0-9]*)      y=$m; m=        # Jahreszahl
16      ;; [jJ]an*)     m=1             # Monat als Name
17      ;; [fF]eb*)     m=2
18      ;; [mM]a[er]*)  m=3
19      ;; [aA]pr*)     m=4
20      ;; [mM]a[iy]*)  m=5
21      ;; [jJ]un*)     m=6
22      ;; [jJ]ul*)     m=7
23      ;; [aA]ug*)     m=8
24      ;; [sS]ep*)     m=9
25      ;; [oO][ck]t*)  m=10
26      ;; [nN]ov*)     m=11
27      ;; [dD]e[cz]*)  m=12
28      ;; *)   echo >&2 "usage: `basename $0` [month [year]]"
29                      exit 1
30      esac
31      
32      exec cal $m $y

Den Fallverteiler kann man eleganter aufschreiben:

 1      #!/bin/sh       
 2      PATH=/usr/ucb:/bin:/usr/bin     # sonst rekursiv...
 3      
 4      case $#
 5      in 0)   set `date`; m=$2; eval y=\$$#   # cal
 6      ;; 1)   m=$1; set `date`; eval y=\$$#   # cal x
 7      ;; *)   m=$1; y=$2                      # cal x y
 8      esac
 9      
10      while :
11      do      case $m
12              in [1-9] | 1[0-2])              # Monatszahl
13              ;; [0-9]*)      y=$m; m=        # Jahreszahl
14              
15              ;; *)   for i in '1 an' '2 eb' '3 ar' \
16                        '3 ae' '4 pr' '5 ay' '5 ai' \
17                        '6 un' '7 ul' '8 ug' '9 ep' \
18                        '10 ct' '10 kt' '11 ov'     \
19                        '12 ec' '12 ez'
20                      do      set $i
21                              case $m
22                              in ?$2*) m=$1   # Monatsname
23                                      break 2
24                              esac
25                      done
26                      echo >&2 "usage: `basename $0` \c"
27                      echo >&2 " [month [year]]"
28                      exit 1
29              esac
30              break
31      done
32      exec cal $m $y


back | next | up | down | Inhalt | Uebungen | Complete | Kommentar


Created by unroff & hp-tools. © by Hans-Peter Bischof. All Rights Reserved (1997).

Last modified 03/July/97