ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2022-04-13 23:00:48  阅读:189  来源: 互联网

标签:week return expr len echo 第四版 cal month bash


题目大意:让你写一个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

 

标签:week,return,expr,len,echo,第四版,cal,month,bash
来源: https://www.cnblogs.com/alphainf/p/16142570.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有