2022-OS-Lab0-总结

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
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值