《现代操作系统(中文第四版)》实验一 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