|
|
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
|
|
Last modified 03/July/97