1. 程式人生 > 其它 >《現代作業系統(中文第四版)》實驗一 bash指令碼實現cal

《現代作業系統(中文第四版)》實驗一 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