《现代操作系统(中文第四版)》实验一 bash脚本实现cal

题目大意:让你写一个bash脚本,实现与linux下cal相同的效果

学习bash语言题,除了区别和c++有亿点区别外其他都还好

  1 monName=("invalid" "January" "February" "March" "April" "May" "June" "July" "August" "September" "October" "November" "December")
  2 
  3 #判断当前输入的字符串$2,是否能代表第$1个月
  4 #支持大小写模糊判断,支持前缀判断
  5 isThisMonth(){
  6     lowercase=$(echo $2 | tr '[A-Z]' '[a-z]') #大小写转换
  7     input_len=${#2} #求长度
  8     month=${monName[$1]} #找出对应月的字符串
  9     month=$(echo $month | tr '[A-Z]' '[a-z]') 
 10     
 11     #前缀比较
 12     if [ "${month:0:$input_len}" = "$lowercase" ] 
 13     then
 14         return 1
 15     else
 16         return 0
 17     fi
 18 }
 19 
 20 #给一个字符串$1,求这个字符串对应哪一个月
 21 getMonth(){
 22     for i in {1..12} #枚举那个月
 23     do
 24         isThisMonth $i $1
 25         if [ $? == 1 ] || [ $1 = $i ] #判断是否是这个月
 26         then
 27             return $i
 28         fi
 29     done
 30     return -1
 31 }
 32 
 33 #给定年和月,求出这个月的1号是星期几
 34 #输入格式,$1为年份,$2为月份
 35 whatDayOfTheWeek(){
 36     y=$1; m=$2; d=1
 37     #y是年份的后两位
 38     #m代表月份
 39     #d代表给定的日,此处求1号的星期几,所以默认为1
 40     
 41     if [ $m -lt 3 ]
 42     then
 43         m=`expr $m + 12`
 44         y=`expr $y - 1`
 45     fi
 46     #通过一个很长的公式求出具体是星期几
 47     week=`expr $d + 2 \* $m + 3 \* \( $m + 1 \) / 5 + $y + $y / 4 + $y / 100 + $y / 400 + 3`
 48     return `expr $week % 7`
 49 }
 50 
 51 #给定年和月,求出这个月有几天
 52 #$1 年份 $2 月份
 53 howManyDays(){
 54     #判断大月
 55     if [ $2 == 1 -o $2 == 3 -o $2 == 5 -o $2 == 7 -o $2 == 8 -o $2 == 10 -o $2 == 12 ]
 56     then
 57         return 31
 58     fi
 59     
 60     #判断小月
 61     if [ $2 == 4 -o $2 == 6 -o $2 == 9 -o $2 == 11 ]
 62     then
 63         return 30
 64     fi
 65     
 66     #通过判断闰年,对二月份的天数进行确定
 67     if [ `expr $1 % 4` == 0 ] && [ `expr $1 % 100` != 0 -o `expr $1 % 400` == 0 ]
 68     then
 69         return 29
 70     else
 71         return 28
 72     fi
 73 }
 74 
 75 #给定年和月,将这个月对应的日历打印出来
 76 #$1代表年份,$2代表月份
 77 printCalandar(){
 78     #打印这个月的月头
 79     echo 'Su Mo Tu We Th Fr Sa'
 80     
 81     #求出这个月的天数,和1号对应的星期
 82     howManyDays $1 $2
 83     days=$?
 84     whatDayOfTheWeek $1 $2
 85     week=$?
 86     #echo $days $week
 87     
 88     #return 0
 89     
 90     #打印填充所需的空白
 91     for i in $(seq 1 1 $week)
 92     do
 93         echo -n '   '
 94     done
 95     
 96     #开始逐日打印
 97     for i in $(seq 1 1 $days)
 98     do
 99         #如果日期小于10,则需要补一个空格
100         if [ $i -lt 10 ]
101         then
102             echo -n ' '
103         fi
104         
105         #显示日期
106         echo -n $i
107         
108         #更新星期几
109         let week=(week+1)%7
110         
111         #根据星期几,决定输出空格还是换行
112         if [ $week == 0 ] && [ $i != $days ]
113         then
114             echo ''
115         else
116             echo -n ' '
117         fi
118     done
119 }
120 
121 #打印日历开头
122 #输入格式,$1为年份,$2为月份
123 printHead(){
124     len_all=20-4-1
125     left_len=1
126     let len_all=len_all-${#2}
127     #echo $len_all
128     left_len=`expr $len_all / 2`
129     left_len=${left_len%.*}
130     
131     #在打印年月前,输出一些空格对齐
132     for i in $(seq 1 1 $left_len)
133     do
134         echo -n ' '
135     done
136     
137     #输出月份,年份
138     echo -n $2 $1
139     
140     #输出空格对齐
141     let len_all=len_all-left_len
142     for i in $(seq 1 1 $len_all)
143     do
144         echo -n ' '
145     done
146     echo ''
147 }
148 
149 getMonth $1
150 month=$?
151 #echo $month
152 printHead $2 ${monName[$month]}
153 printCalandar $2 $month

 

posted @ 2022-04-13 22:55  AlphaInf  阅读(205)  评论(0编辑  收藏  举报