exam
不错的exam。考核内容完全来自于指导书与作业,并且足够全面。
这在lab上机中是很好的设计,掌握不那么牢固的可以通过花费一点时间阅读指导书拿到exam这一主要分数,提升掌握水平
而相对熟练的同学则可以更快地解决exam去攻克extra了。
另外,一定要认真读前言里的要求!本次exam题就需要先bash init.sh才能得到所需文件
题目有两道:Makefile与Shell
Makefile
Makefile考的仍然是gcc,run和clean三件套
|
|
不过这次在gcc上的考点比较新:
- 编译不链接 gcc -c
- 非标准库头文件 gcc -I 头文件目录
此外,还考查了make A任务内调用make B的内容
也可以考察跨目录make调用
即 cd 目录 && make
Shell
本题一共有九问,也就是九个功能,
比较惹人烦的点在于这九个功能要在9个脚本中分别实现
如果你足够熟悉,
你可以直接
sed -i '1i#!/bin/bash' exam_*.sh
来为每一行开头加上#!/bin/bash
九个脚本的内容是:
- 在指定目录下新建目录
- grep指令
- mv指令
- cp -r指令
- 循环语句与sed 替换
- 通配符*
- 2»
- chmod
- 条件语句
需要注意的一些点:
-
双引号,单引号
取决你是否要解析引号内的内容对于awk中$1有特殊含义,便需要单引号处理
而sed中如果需要$1参数,那当然是要用双引号的
-
$符号作为尾行,又是参数解析符号,若要从$1到$进行p,如果写成sed -n ‘$1,$p’的话,$1不能解析;写成sed -n “$1,$p"的话,p又会被解析。
那么我们可以用空格分隔开。即sed -n “$1,$ p” -
脚本内加减运算的写法,if,for,while,case的写法
extra
接下来来到万恶的extra
其本身的难度可能也不能直接称之为高,但是我还是认为应该明确地表示充分利用hint的内容
因为hint中的内容,不仅太多,而且太重要,太必要!
对于第二问ln -s的超链接写法,这显然是回去看hint的,因为完全没有听说过
但是第一问不仅hint很晚才更新,另外还伪装成不用hint也能解决的问题,使很多同学花费了很多时间去用man来看已知指令的参数
其次,后置测试点依赖前置测试点。虽然他确实对于评测是更方便的,但是偏偏在第一问出现hint的缺失,从而影响到整个题目的得分,给人的体验还是不太好的。
genCode
第一问的主要任务是:
对于指定目录下的所有.sh文件,将其经过一些简单的sed文件处理后,以原名称(不含.sh).c
的新名字存放在新的指定目录。
其他的都不难,最难的就在于怎么实现获取文件名与文件重命名
大多数同学都尝试过sed xxxxxx *.sy > *.c
然后意外的发现只生成了一个名为'*.c'
的文件……
笔者找了找mv的man
mv是笔者知道的唯一的重命名指令
然后找到了-S, –suffix=[后缀名]这样的东西。
当然并没能实现功能。
后来助教说extra内容更新了。我看了眼题面,感觉没变,以为是第四第五题改了,就没在意。实际上发布的正是第一题的hint,能够实现对一个目录下所有文件都访问,并获取其文件名。
那么本题的考点就是awk指令
awk -F.并取$1来获得.sy前面的内容
selectCode
-
若存在则删除xxx
考察的其实是rm -f强制执行(若不存在则自动忽视)
-
ln -s (hint 超链接操作)
-
gcc -I -o
selectData
本小问需要实现将所有的xx_yy.in与xx_yy.out文件根据参数进行复制。(xx与yy都是随机的)
若参数为all,则全部复制到指定目录
否则,仅复制参数_yy.in与参数_yy.out到指定目录
这里可以使用case语句
|
|
注意好格式。
未知
很遗憾,在我做完二三问,并发现有测试点依赖后,就全力研究第一问了。没能获得第四、五问的题目。同学们可以参考其它博客。
后记
不同于往年,今年的题目难度确实是大。大多数人都extra都喜提0分(或者未提交)
倘若第一问hint能够正常给出,本次lab的体验感应该还是不错的。
笔者给extra留了一整个小时还攻不下第一问,可见该hint的重要性()
现在想起自己实验报告里写OS多温和什么的,,,
OS的磨难才刚刚开始。