《现代操作系统(中文第四版)》实验一 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
《现代操作系统(中文第四版)》实验一 bash脚本实现cal的更多相关文章
- C++ Primer中文第四版
C++ Primer中文第四版 在简书上发现有挂羊头卖狗肉的,发的plus,而且压缩包还得付钱获取密码,我直接去github搜到了第四版,在此分享一下. 格式:pdf 书签目录:有 下载地址: ...
- Java编程思想第四版完整中文高清版.pdf
Java编程思想第四版完整中文高清版.pdf 链接: https://pan.baidu.com/s/1vV5BHF3L-bnaG6WGurdJ_A 提取码: vigy 复制这段内容后打开百度网盘手机 ...
- 笨办法学python 第四版 中文pdf高清版|网盘下载内附提取码
笨办法学 Python是Zed Shaw 编写的一本Python入门书籍.适合对计算机了解不多,没有学过编程,但对编程感兴趣的朋友学习使用.这本书以习题的方式引导读者一步一步学习编 程,从简单的打印一 ...
- 《Java编程思想第四版》附录 B 对比 C++和 Java
<Java编程思想第四版完整中文高清版.pdf>-笔记 附录 B 对比 C++和 Java “作为一名 C++程序员,我们早已掌握了面向对象程序设计的基本概念,而且 Java 的语法无疑是 ...
- 算法第四版-文字版-下载地址-Robert Sedgewick
下载地址:https://download.csdn.net/download/moshenglv/10777447 算法第四版,文字版,可复制,方便copy代码 目录: 第1章 基 础 ...... ...
- 在Eclipse下配置算法(第四版)运行环境
第一步:配置Eclipse运行环境 Eclipse运行环境配置过程是很简单的,用过Eclipse进行java开发或学习的同学应该都很熟悉这个过程了. 配置过程: (1)系统环境:Windows7 64 ...
- Java编程思想第四版勘误
坊间传说这本书翻译得很烂,我倒觉得还好.虽然看原文更准确,但是如果在具备一定编程思维和基础.能够看出来疑问的情况下,还是看中文更快一些,而且这本书本身也不适合初学者看.当然,错误和不通顺还是有的,而且 ...
- 20155323 第四次实验 Android程序设计实验报告
20155323 第四次实验 Android程序设计实验报告 实验内容 1.基于Android Studio开发简单的Android应用并部署测试; 2.了解Android.组件.布局管理器的使用: ...
- 算法(第四版)C#题解——2.1
算法(第四版)C#题解——2.1 写在前面 整个项目都托管在了 Github 上:https://github.com/ikesnowy/Algorithms-4th-Edition-in-Csh ...
随机推荐
- java中常见的锁
1.悲观锁 认为别的线程都会修改数据,二话不说先锁上 synchronized 2.乐观锁 乐观豁达,起初不操作.最后修改的时候比对一下版本,不一致再上锁 3.可重入锁 外层锁了之后,内层仍可以直接使 ...
- 论文阅读 GloDyNE Global Topology Preserving Dynamic Network Embedding
11 GloDyNE Global Topology Preserving Dynamic Network Embedding link:http://arxiv.org/abs/2008.01935 ...
- SuperSocket 1.6 创建一个简易的报文长度在头部的Socket服务器
我们来做一个头为6位报文总长度,并且长度不包含长度域自身的例子.比如这样的Socket报文000006123456. 添加SuperSocket.Engine,直接使用Nuget搜索SuperSock ...
- 在eclipse配置javafx
JAVA学习中,遇到了这个问题,解决方法记录一下(我用的jdk11) 最新几版的eclipse中没有javafx,需要自己进行手动配置,先下载一下javafx的包,解压,找到lib文件夹(主要用的是这 ...
- 看起来是线程池的BUG,但是我认为是源码设计不合理。
你好呀,我是歪歪. 前几天看到一个 JDK 线程池的 BUG,我去了解了一下,摸清楚了它的症结所在之后,我觉得这个 BUG 是属于一种线程池方法设计不合理的地方,而且官方在知道这个 BUG 之后表示: ...
- 使用APICloud AVM框架开发预约应用
前段时间跟朋友一起搞了一个预约的项目,前端用的APICloud的AVM框架做的,后端用的php开发的,用的tp5框架,没几天就搞出来了.简单跟大家分享一下开发中的一些功能点的实现吧.也欢迎大家一起探讨 ...
- [SWPU2019]Web1-1|SQL注入
1.打开之后界面如下: 2.查看源代码.登录注入等未发现有用信息,结果如下: 3.进行注册试试,注册时发现admin账户已被注册,随便注册一个账户并登录,结果如下: 申请发布广告页面如下: 4.发布广 ...
- 带你熟悉云网络的“电话簿”:DNS
摘要:无论你域名怎么解析,最终我还是要用IP和别人通信的.域名只是你的皮囊,IP才是你的灵魂. 本文分享自华为云社区<<跟唐老师学习云网络> - DNS电话簿>,作者: tsj ...
- Docker容器保姆:在centos7.6上利用docker-compose统一管理容器和服务
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_108 众所周知,一个大型的Docker容器组成的微服务应用中,容器的数量是非常巨大的,如果依赖传统的人工配置方式进行维护,对于开发 ...
- JavaWeb--Cookie与Session
前言 Java Web 其实就是一个技术的总和,把Web看成一个容器而已主要使用JavaEE技术来实现.在加上各种中间件. 整个javaWeb阶段的内容通过实际的案例贯穿学习, 所涉及到的技术知识点会 ...