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

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

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

《现代操作系统(中文第四版)》实验一 bash脚本实现cal的更多相关文章

  1. C++ Primer中文第四版

    C++ Primer中文第四版 在简书上发现有挂羊头卖狗肉的,发的plus,而且压缩包还得付钱获取密码,我直接去github搜到了第四版,在此分享一下.   格式:pdf 书签目录:有   下载地址: ...

  2. Java编程思想第四版完整中文高清版.pdf

    Java编程思想第四版完整中文高清版.pdf 链接: https://pan.baidu.com/s/1vV5BHF3L-bnaG6WGurdJ_A 提取码: vigy 复制这段内容后打开百度网盘手机 ...

  3. 笨办法学python 第四版 中文pdf高清版|网盘下载内附提取码

    笨办法学 Python是Zed Shaw 编写的一本Python入门书籍.适合对计算机了解不多,没有学过编程,但对编程感兴趣的朋友学习使用.这本书以习题的方式引导读者一步一步学习编 程,从简单的打印一 ...

  4. 《Java编程思想第四版》附录 B 对比 C++和 Java

    <Java编程思想第四版完整中文高清版.pdf>-笔记 附录 B 对比 C++和 Java “作为一名 C++程序员,我们早已掌握了面向对象程序设计的基本概念,而且 Java 的语法无疑是 ...

  5. 算法第四版-文字版-下载地址-Robert Sedgewick

    下载地址:https://download.csdn.net/download/moshenglv/10777447 算法第四版,文字版,可复制,方便copy代码 目录: 第1章 基 础 ...... ...

  6. 在Eclipse下配置算法(第四版)运行环境

    第一步:配置Eclipse运行环境 Eclipse运行环境配置过程是很简单的,用过Eclipse进行java开发或学习的同学应该都很熟悉这个过程了. 配置过程: (1)系统环境:Windows7 64 ...

  7. Java编程思想第四版勘误

    坊间传说这本书翻译得很烂,我倒觉得还好.虽然看原文更准确,但是如果在具备一定编程思维和基础.能够看出来疑问的情况下,还是看中文更快一些,而且这本书本身也不适合初学者看.当然,错误和不通顺还是有的,而且 ...

  8. 20155323 第四次实验 Android程序设计实验报告

    20155323 第四次实验 Android程序设计实验报告 实验内容 1.基于Android Studio开发简单的Android应用并部署测试; 2.了解Android.组件.布局管理器的使用: ...

  9. 算法(第四版)C#题解——2.1

    算法(第四版)C#题解——2.1   写在前面 整个项目都托管在了 Github 上:https://github.com/ikesnowy/Algorithms-4th-Edition-in-Csh ...

随机推荐

  1. 深入理解 volatile 关键字

    volatile 关键字是 Java 语言的高级特性,但要弄清楚其工作原理,需要先弄懂 Java 内存模型.如果你之前没了解过 Java 内存模型,那可以先看看之前我写过的一篇「深入理解 Java 内 ...

  2. 【RocketMQ】消息的存储

    Broker对消息的处理 BrokerController初始化的过程中,调用registerProcessor方法注册了处理器,在注册处理器的代码中可以看到创建了处理消息发送的处理器对象SendMe ...

  3. C# MVCapi跨域问题

     he 'Access-Control-Allow-Origin' header contains multiple values ', *', but only one is allowed. Or ...

  4. 啥也不是 -「OI 易犯错误整理」

    原帖出自 Nefelibata,不过他不想维护,所以就交给 STrAduts 了 awa.因为一些不可抗力,帖主转移至 XSC062.申请置顶! 前言 Nefelibata:因为笔者弱到无法形容,因此 ...

  5. HBase学习(一) 基本概念和安装基本命令

    HBase学习(一) 一.了解HBase 官方文档:https://hbase.apache.org/book.html 1.1 HBase概述 HBase 是一个高可靠性.高性能.面向列.可伸缩的分 ...

  6. Hive优化(面试宝典)(详细的九个优化)

    Hive优化(面试宝典) 1.1 hive的随机抓取策略 理论上来说,Hive中的所有sql都需要进行mapreduce,但是hive的抓取策略帮我们 省略掉了这个过程,把切片split的过程提前帮我 ...

  7. NOI / 2.5基本算法之搜索-6044:鸣人和佐助详解

    总时间限制: 1000ms 内存限制: 65536kB 题目 佐助被大蛇丸诱骗走了,鸣人在多少时间内能追上他呢? 已知一张地图(以二维矩阵的形式表示)以及佐助和鸣人的位置.地图上的每个位置都可以走到, ...

  8. 2505-springboot使用spring.profiles.active来分区配置

    参考文献: spring boot 入门 使用spring.profiles.active来分区配置 http://www.leftso.com/blog/111.html 很多时候,我们项目在开发环 ...

  9. css基础03

    就近原则执行粉色.而不是全覆盖,只有样式冲突的地方才会覆盖. 会执行粉色和12px.后来者居上 高度宽度内外边距这些不会继承. 子元素会继承行高, 1.5是行高是字体大小的1.5倍的意思. 有了!im ...

  10. 基于python3.7利用Motor来异步读写Mongodb提高效率

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_111 如果使用Python做大型海量数据批量任务时,并且backend用mongodb做数据储存时,常常面临大量读写数据库的情况. ...