lab0
Lab 0 主要就是一个 Makefile 和 Linux shell 的练习。你可以从这里获取今年实验的公开指导书(截至发稿时的版本,存于互联网档案馆)。
练习题
Exercise 0.1
好久没写 C。虽然连 palindrome 都不会写了,但是好像懂得比以前多了很多)
剩下 3 问没什么难度。唯须注意的是:
[Makefile 中] 有一点尤为需要注意,每一个命令 (command) 之前必须用一个制表符(Tab)缩进。这里必须使用制表符而不能是空格,否则 make 会报错。
考试的时候被坑了。
Exercise 0.2
Shell 的条件和循环。
a=1
while [ $a -le 100 ]
do
if [ $a -gt 70 ]
then
rm -r "file$a"
elif [ $a -gt 40 ]
then
mv "file$a" "newfile$a"
fi
# ((a++))
a=$((a+1))
# don't forget change the loop variable
done
Exercise 0.3
# First you can use grep (-n) to find the number of lines of string.
# Then you can use awk to separate the answer.
grep -n "$2" "$1" | cut -d: -f1 > "$3"
cut -d
后面是分隔符,-f1
是第一个字段,即行号。
Exercise 0.4
sed -i "s|$2|$3|g" "$1"
需要 include 头文件。
all:
bash modify.sh fibo.c char int
gcc -c fibo.c main.c -I../include
lab0-exam
GCC & Makefile Quiz
完成初始化后,仓库根目录下已经生成了 Makefile、check.c、src 文件夹和 out 文件夹。
在仓库根目录(如 ~/23xxxxx )下编写 Makefile。要求实现的功能如下:
执行命令 | 实现功能 |
---|---|
make check | 利用 gcc 将同目录下的 check.c 编译成名为 check.o 的未链接的目标文件,并放在同目录下。 |
make | 完成 make check 要求的功能。然后利用 gcc 将 src 下的 main.c、output.c 编译成名为 main 的可执行文件,并放在 out 目录下。 |
make run | 直接运行可执行文件 out/main。 |
make clean | 删除目标文件 check.o、可执行文件 out/main。 |
GCC & Bash Quiz
完成初始化后,仓库根目录下已经生成了 exam_1.sh 至 exam_9.sh(从1开始的连续整命令名的.sh文件,共9个)、run_exam.sh、stderr.txt 和 origin 文件夹。
在仓库根目录(如 ~/23xxxxx )下编写 exam_1.sh 至 exam_9.sh。要求实现且仅实现以下第x点功能。
这些脚本将被 run_exam.sh 调用执行。使用
run_exam.sh
的命令格式为bash run_exam.sh [n] [s] [t]
,其中 n 为小于等于9 的整数,表示将按顺序执行exam_1.sh
至exam_n.sh
。若 n 未给出,将默认是 9。可选的 s 和 t 用于传递给exam_9.sh
,具体要求见第 9 点功能。(注意:根据命令格式,若要指定 s 和 t,必须先指定 n)
这个部分讨厌的是评测点是累进的,由于后面的操作依赖于前面的操作,所以如果前面的操作没有正确实现,写完提交一看才十几分比较虚。不过文件操作的话,后面的操作可以作为前面的提示。
-
创建一个新的目录,名为 result。再在 result 目录下创建两个新的目录,名为 code 和 backup。
exam_1.sh mkdir result mkdir result/code mkdir result/backup
-
将 origin 目录下的 basic.c 的文件中包含 hello(区分大小写)的行输出。
exam_2.sh grep "hello" origin/basic.c
-
将 origin 目录下的 basic.c 文件移动到 result 目录下。
exam_3.sh mv origin/basic.c result/basic.c
-
将 origin 目录下的 code 目录及其内容复制到 result/backup 目录下。
exam_4.sh cp -r origin/code result/backup/code cp origin/code/* result/backup/
不知道具体要求的是哪一种,似乎第一次尝试时没过评测。
-
将 origin/code 目录下的 0.c 1.c 2.c …… 20.c(从0开始的连续整数命名的 .c 文件,共21个)文件中的所有
REPLACE
(区分大小写)替换为文件名(不含扩展名),替换的结果保存到 result/code 目录下的同名文件中。如对于这样的 origin/code/1.c:
int main() { return REPLACE; }
替换的结果如下,并且这个结果保存在 result/code/1.c 中:
int main() { return 1; }
这里麻烦的是如何从路径提取不含后缀的文件名。之前打 Hackgergame 的时候研究过一番 shell 字符串处理(欠了两年题解没写:),但是都忘了。是次考前从图书馆借了两本 Linux Shell 编程的书,从例子部分偷到了用法。
Linux Shell命令行及脚本编程实例详解(第2版) book
2024 ISBN 9787302660194by 刘艳涛、出版社:清华大学出版社《Linux Shell命令行及脚本编程实例详解(第2版)》是获得大量读者好评的“Linux典藏大系”中的经典畅销书《Linux Shell命令行及脚本编程实例详解》的第2版。本书第1版累计13次印刷,销量超过2万册,被ChinaUnix技术社区大力推荐。本书理论结合实践,全面、系统地介绍Linux Shell(Bash)脚本编程的语法、命令和技巧等内容。本书偏重于实践,在讲解理论知识时结合大量典型实例让读者了解理论知识在实际环境中的应用,并对易混淆和较难理解的知识点做了重点分析,以加深读者对知识的理解。本书提供教学视频、实例源程序、思维导图、教学PPT和习题参考答案等超值配套资源,以帮助读者高效、直观地学习。 《Linux Shell命令行及脚本编程实例详解(第2版)》共15章,分为2篇。第1篇“Linux Shell基础知识与命令”,主要内容包括Linux和Linux Shell简介、初识Linux Shell、常用的Shell(Bash)命令、Shell命令进阶;第2篇“Shell脚本编程”,主要内容包括Shell编程基础、Shell的条件执行、Bash循环、Shell函数、正则表达式、脚本输入处理、Shell重定向、管道和过滤器、捕获、sed和awk、其他Linux Shell概述。 《Linux Shell命令行及脚本编程实例详解(第2版)》非常适合初次接触Linux Shell命令行和脚本编程的入门读者阅读,也适合有一定基础而想进一步提升的进阶读者阅读,还适合作为高等院校和Linux培训机构的教材。对于基于Linux平台的开发人员而言,本书还是一本不可多得的案头查询手册。 刘艳涛,就职于一家全球500强通信公司,从事公司无线产品研发中心的Linux/Unix操作系统的管理和技术支持。有超过15年的Linux系统管理与运维经验,擅长用Shell等脚本语言实现自动化运维管理,以及配置Nagios与Ganglia集成的自动化监控和故障报警平台,对Linux系统性能优化有深入的研究。
exam_5.sh for file in `ls origin/code/*.c` do filename=${file##*/} # echo $filename # echo ${filename%.*} sed "s/REPLACE/${filename%.*}/g" $file > "result/code/${filename}" # sed 's/REPLACE//g' $file > done
- 从开头删除最短匹配的模式:
var#
- 从开头删除最长匹配的模式:
var##
- 从结尾删除最短匹配的模式:
var%
- 从结尾删除最长匹配的模式:
var%%
用 basename 的话,
$(basename "$file" .${file##*.})
。 - 从开头删除最短匹配的模式:
-
将 result/code 目录下的全部 .c 文件一起编译为可执行文件 result/verify。
exam_6.sh gcc result/code/*.c -o result/verify
-
运行可执行文件 result/verify,将其标准错误输出的内容追加到仓库根目录下的 stderr.txt 文件。
exam_7.sh ./result/verify 2>>stderr.txt
-
将 stderr.txt 文件的权限修改为 r--r-----。
exam_8.sh chmod 440 stderr.txt
-
run_exam.sh 以 bash `exam_9.sh [s] [t]` 的格式向 exam_9.sh 传入两个参数 s, t(整数且 s < t)。
- 两个参数缺省时,输出 stderr.txt 的所有内容。
- 仅缺省 t 时,输出 stderr.txt 自行开始(行号从 1 开始编译,输出自第 s 行)至结尾的内容。
- 两个参数指定时,输出 stderr.txt 自第 s 行至第 t 行的内容(输出包含第 s 行,不含第 t 行)。
exam_9.sh if [ -n "$1" ]; then if [ -n "$2" ]; then # echo "a" # echo "$(($2 - 1))" sed -n "$1,$(($2 - 1))p" stderr.txt else # echo "b" sed -n "$1,\$p" stderr.txt fi else cat stderr.txt fi
这块需要需要注意的是,
sed
的p
命令打印的行数从 1 开始,且包含结束行。head
和tail
组合也可以,但是仍然需要 。
提示
- 下发文件中包含一个初始化脚本
init.sh
,如果你想将你的工作目录下除了 Makefile 和 exam_1.sh 至 exam_9.sh 之外的所有文件恢复到题目下发时的状态,可以使用命令bash init.sh
执行该脚本。- 将多个文件一起编译,可以借助通配符
*
。如强制删除当前目录下的所有扩展名为.txt
的文件可以使用rm -f *.txt
。参考输出
使用下发的
init.sh
初始化后,执行make
后再执行make run
的参考结果为:
评论