Lab0-总结
文章目录
涉及知识点
- 实验流程
- 获取代码
- 本地按要求编写
- 提交代码
- 课下习题踩坑总结
- Ex0.1
- Ex0.2
- Ex0.3
- Ex0.4
实验流程
#首先cd 至学号仓库下
#拉取远端实验分支(以lab0为例)
git checkout lab0
#拉取成功后即可在lab0分之下进行实验代码的编写
....
#完成后,提交代码至远程仓库进行测试
cd 仓库目录
git add . #文件提交至暂存区
git commit #更新至本地仓库
git push #再推送至远端,完成提交
#记得多用 git pull来实时更新远端代码
踩坑总结
Ex0.1
2.在src目录下,存在一个未补全的Makefile文件,借助刚刚掌握的Makefile知识,将其补全,以实现通过make指令触发src目录下的palindrome.c文件的编译链接的功能,生成的可执行文件命名为palindrome
涉及Makefile的相关知识
+ 注意每一个指令 (command) 之前必须有一 个 TAB。这里必须使用 TAB 而不能是空格,否则 make 会报错。
+ 一般执行指令时,若target省略,仅有make指令,好像默认执行Makefile中第一个?
3.在src/sh_test目录下,有一个file文件和hello_os.sh文件。hello_os.sh是一个未完成的脚本文档,请同学们借助shell编程的知识,将其补完,以实现通过指令bash hello_os.sh AAA BBB,在hello_os.sh所处的文件夹新建一个名为BBB的文件,其内容为AAA文件的第8、32、128、512、1024行的内容提取(AAA文件行数一定超过1024行)。[注意:对于指令bash hello_os.sh AAA BBB,AAA及BBB可为任何合法文件的名称,例如bash hello_os.sh file hello_os.c,若以有hello_os.c文件,则将其原有内容覆盖]****
涉及sed、touch、重定向、shell脚本参数传递相关知识
-
sed指令:输出文件指定行
sed -n '1,10p' file #输出file文件1到10行 sed -n '1p;10p' file #输出file文件第1行和第10
-
touch:新建文件 mkdir:新建文件夹
-
重定向:使用 > 来重定向输出, >>表示在文件后追加而不是覆盖原有内容, < 重定向输入
-
cut指令:对内容进行分割,并指定输出哪一部分
指令格式:cut [options] [file] 参数: -c (char) 以字符为单位进行分割 -b (byte) 以字节为单位进行分割 -f (field) 以区域为单位进行分割,区域由-d定义 -d 自定义区域,与-f一起使用 -d后紧接定义区域的分隔符
-
Shell脚本参数传递:
- $1表示第一个参数,以此类推
- $0表示脚本名
Ex0.2
1.在lab0工作区的ray/sh_test1目录中,含有100个子文件夹file1~file100,还存在一个名为changefile.sh的文件,将其补完,以实现通过指令bash changefile.sh,可以删除该文件夹内file71file100共计30个子文件夹,将file41file70共计30个子文件夹重命名为newfile41newfile70,保留file1file40共计40个子文件夹。[注意:评测时仅评测changefile.sh的正确性]****
涉及变量的使用、循环、条件语句等内容
-
变量使用:假定有个变量a ,用**$a**表示变量的值!
自增操作! #错误写法 a=a+1 #正确写法 a=$[$a+1]
-
if的格式:
if condition then command1 command2 ... elif condition then comman1 ... else then command1 .. fi
注意,command请写在then的后面!而不是条件的后面!
Ex0.3
1.在lab0工作区的ray/sh_test2目录下,存在一个未补全的search.sh文件,将其补完,以实现通过指令bash search.sh file int result,可以在当前文件夹下生成result文件,内容为file文件所有含有int字符串对应的行数,即若有多行含有int字符串需要全部输出。[注意:对于指令bash search.sh file int result,file及result可为任何合法文件名称,int可为任何合法字符串,若已有result文件,则将其原有内容覆盖,匹配时大小写不忽略]
涉及管道、grep、cut、(awk)的相关知识
-
grep:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Wz1koVBl-1647261107768)(G:\大学\大二下\操作系统OS\实验\Lab0\1.png)]
-
管道:用”|“连接命令,用于将前一个命令的stdout作为后一个命令的std
command1 | command2
-
cut指令:对内容进行分割,并指定输出哪一部分
指令格式:cut [options] [file] 参数: -c (char) 以字符为单位进行分割 -b (byte) 以字节为单位进行分割 -f (field) 以区域为单位进行分割,区域由-d定义 -d 自定义区域,与-f一起使用 -d后紧接定义区域的分隔符
本题解法:(脚本内容)
#!bin/bash
#First you can use grep (-n) to find the number of lines of string.
#Then you can use awk to separate the answer
# bash search.sh file int result
grep -n $2 $1 | cut -f1 -d: > $3
解释:grep 将在file中找int字符串所在的行 输出行号和匹配信息,例如(39:int)
此时再将输出重定向作为cut命令的stdin,自定义 **:**为分隔符划分两个区域,-f1选择第一个区域即行号再输出至指定文件
Ex0.4
1.在lab0工作区的csc/code目录下,存在fibo.c、main.c,其中fibo.c有点小问题,还有一个未补全的modify.sh文件,将其补完,以实现通过指令bash modify.sh fibo.c char int,可以将fibo.c中所有的char字符串更改为int字符串。[注意:对于指令bash modify.sh fibo.c char int,fibo.c可为任何合法文件,char及int可为任何合法字符串,评测时评测modify.sh的正确性,而不是检查修改后fibo.c的正确性]
涉及脚本本地执行、sed替换相关内容
-
脚本本地执行:
chmod +x my.sh bash my.sh #先用chmod命令将脚本my.sh添加权限,然后才能执行
-
sed替换字符串命令:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KzTFooVT-1647261107770)(G:\大学\大二下\操作系统OS\实验\Lab0\2.png)]
注意 不添加-i参数的话是不会修改源文件的,而是输出到屏幕
坑点!!:脚本中参数的显示!
-
在使用 s e d sed sed时,需要用’'单引号,但此时内部是参数形式$1等,会导致参数无法识别!效果如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UfCBF2KT-1647261107771)(G:\大学\大二下\操作系统OS\实验\Lab0\5.png)]
注意!此时$2,$3为红色,而$1为紫色,可以看出只有$1被识别为参数而会导致出错!
-
正确做法:将单引号换成双引号即可,效果如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HpoCAs4u-1647261107772)(G:\大学\大二下\操作系统OS\实验\Lab0\4.png)]
可以看到,参数被识别了,变成紫色,正确!
-
2.lab0工作区的csc/code/fibo.c成功更换字段后(bash modify.sh fibo.c char int),现已有csc/Makefile和csc/code/Makefile,补全两个Makefile文件,要求在csc目录下通过指令make可在csc/code文件夹中生成fibo.o、main.o,在csc文件夹中生成可执行文件fibo,再输入指令make clean后只删除两个.o文件。注意:不能修改fibo.h和main.c文件中的内容,提交的文件中fibo.c必须是修改后正确的fibo.c,可执行文件fibo作用是从stdin输入一个整数n,可以输出斐波那契数列前n项,每一项之间用空格分开。比如n=5,输出1 1 2 3 5
涉及gcc编译的相关知识
-
gcc编译:
-
参数:
- -c 编译成.o文件
- -g显示调试信息
- -o < f i l e n a m e > <filename> <filename> 指定编译后的可执行文件的名称(也可理解为路径!)
- -S 生成.s汇编文件
- -I +路径 为添加头文件(.h)指定搜索目录,也就是你的头文件应该在该路径下能找到
-
使用注意!
-
-o , -c, -s 后都要紧跟文件名(路径),否则无法识别参数,不能有
gcc -o -c main.c
这种出现
-
如果当前在csc目录下,但main.c, fibo.c都在csc/code/下,如何编译?
gcc ./code/main.c ./code/main.o
如果不加./code/,无法找到文件!
-
头文件索引同理,注意路径写到文件所在处上一级!
#例如 fibo.h在csc/include/下 gcc -I ./include/ #正确 gcc -I ./include/fibo.h #错误!
-
-
本题答案如下:
all: ./code/fibo.c ./code/main.c
gcc -o fibo ./code/main.c ./code/fibo.c -I ./include/
gcc -o ./code/main.o -c ./code/main.c -I ./include/
gcc -o ./code/fibo.o -c ./code/fibo.c -I ./include/
clean:
rm ./code/fibo.o
rm ./code/main.o
#csc/Makefile文件内容 注意gcc的写法
-o fibo ./code/main.c ./code/fibo.c -I ./include/
gcc -o ./code/main.o -c ./code/main.c -I ./include/
gcc -o ./code/fibo.o -c ./code/fibo.c -I ./include/
clean:
rm ./code/fibo.o
rm ./code/main.o
#csc/Makefile文件内容 注意gcc的写法
###### ---author Jiang_li31