大学课件-Unix实验报告2
unix实验报告

unix实验报告《Unix实验报告》摘要:本实验报告旨在介绍Unix操作系统的基本概念、特点和使用方法。
通过实际操作和案例分析,展示了Unix操作系统的强大功能和灵活性,以及其在计算机科学和工程领域的重要性。
1. 引言Unix操作系统是一种多用户、多任务的操作系统,具有稳定性高、安全性强、灵活性大等特点。
它被广泛应用于服务器、工作站和个人电脑等领域,为用户提供了丰富的命令行工具和强大的脚本编程环境。
2. Unix操作系统的基本概念Unix操作系统的基本概念包括文件系统、进程管理、用户管理、权限控制等。
文件系统是Unix操作系统的核心,它采用树状结构组织文件和目录,并提供了丰富的文件操作命令。
进程管理是Unix操作系统的另一个重要特点,它允许多个进程同时运行,并提供了进程控制、调度和通信的功能。
用户管理和权限控制则是Unix操作系统的安全保障,它允许管理员对用户和文件进行灵活的管理和权限设置。
3. Unix操作系统的特点Unix操作系统具有很多特点,如多用户、多任务、多线程、分时共享、高性能等。
它采用了模块化设计和分层结构,使得系统更加稳定和可靠。
此外,Unix 操作系统还提供了丰富的命令行工具和编程环境,为用户提供了强大的自定义和扩展能力。
4. Unix操作系统的使用方法Unix操作系统的使用方法主要包括命令行操作、脚本编程、系统管理等。
通过实际操作和案例分析,我们可以了解到如何使用Unix操作系统进行文件操作、进程管理、用户管理、权限控制等。
同时,我们还可以学习到如何使用Shell脚本进行自动化任务的编写和执行,以及如何进行系统管理和性能调优。
5. 结论Unix操作系统是一种强大而灵活的操作系统,它为用户提供了丰富的命令行工具和编程环境,同时具有稳定性高、安全性强、灵活性大等特点。
通过实际操作和案例分析,我们可以更加深入地了解Unix操作系统的基本概念、特点和使用方法,从而更好地应用它来解决实际问题。
操作系统课件 第十二章 UNIX 实例分析(2)

后台命令
–在一般命令之后加上一个符号"&", 即成为
后台命令
输入输出重新定向
–用文件来取代标准输入设备或标准输出设备称
作I/O重新定向 –用符号"<","<<",">",">>"分别表示 输入重新定向和输出重新定向
12.8 外壳语言
管道线与过滤器
–利用管道文件pipe可以实现管道线和过滤器 –符号"|"在UNIX系统中被称作管道符 –可以将两个或多个shell命令串联在一起 –前一个命令的标准输出作为后一个命令的标
12.6 设备管理
打开一个设备文件即相当于申请对应的 设备, 如该设备已处于打开状态则等待 关闭一个设备文件即相当于释放对应的 设备, 如有等待者则唤醒一个 读写一个设备文件就相当于对所对应的 设备执行I/O操作
缓冲与缓存
块型设备缓冲
– 用于磁盘,磁带等设备的I/O传输 – 每个缓冲区的长度与块型物理设备中一个块
p_ppid=9 user结构 程序P (覆盖原来程序)
exit(2)
父进程
子进程
pid=wait(&status) 等待子进程终止
proc结构
p_pid=9
proc结构
p_pid=15
p_ppid=5 user结构 pid=fork(); if(pid == 0) /*不成立*/ { execl("P",0); }else{
复制
{ /*子进程代码*/ }else{ /*父进程代码*/ } …
子进程号 (>0整数)
}else{ /*父进程代码*/ } …
中国矿业大学unix实验

《UNIX》实验指导实验一、Linux基本命令1.实验目的掌握linux平台下的基本命令(40个)2.实验说明在介绍所有的命令之前,先介绍一下Linux的在线帮助man。
在Linux下,当你要查找一个命令的用法的,你可以通过 man 命令名来源得命令的详细说明。
因为每个Linux都有一份man文档,所以介绍命令的时候我们只是简直介绍一下命令的学用选项。
如果想查看命令的详细说明,请自己看man。
下面是man各小节的内容:1用户命令。
2系统调用。
3库函数。
4特殊文件(设备和网络接口)。
5文件格式。
6游戏和演示。
7系统环境、表格和宏。
8系统管理和相关命令。
3.命令说明略4. 补充说明本次实验很难完成所有命令的操作,建议参考《Linux命令大全(修改版)》,掌握linux 平台下的所有命令。
5.实验结果以下是一些命令的演示截图6. 实验体会通过本次实验,我对linux的命令有了一定的了解,为接下来的shell编程实验打下了一定的基础。
实验二、shell编程1.实验目的熟练掌握Shell Script编程,加深对linux系统的理解2.实验要求1.知道如何执行shell程序2.在shell脚本中要体现条件控制(如if结构和条件分支)3.在shell脚本中要体现循环(for,while和until循环)4.掌握shell程序的调试3.Shell脚本举例1)赶走一些你不希望进入的用户2)一个简单的目录菜单3)函数调用4)Shell脚本的感染5)列出当前目录下的文件数目6)列出当前目录下的C语言文件4. 实验结果1234565. 实验体会通过本次实验,我对Linux系统下的shell编程有了一定的了解和掌握。
实验三、进程控制1. 实验目的了解与进程控制相关的各种系统调用,加深对进程的状态变迁与进程调度的理解。
2. 实验要求1.掌握进程的创建fork系统调用的原理。
2.掌握exec系统调用的原理。
3.掌握exit系统调用的原理。
Unix实验报告

Unix实验报告计算机科学与技术系实验报告专业名称网络工程课程名称《网络操作系统》项目名称UNIX的Shell班级学号姓名同组人员无实验日期2016.6实验5 UNIX的Shell一、实验目的与要求:(简述本次实验要求达到的目的,涉及到的相关知识点,实验的具体要求。
)掌握UNIX B-shell的主要功能和shell脚本的编写、运行。
二、实验内容(请根据电子版实验指导书撰写如下内容:实验环境、实验子项目名称、实验步骤、实验运行结果)1、验证UNIX B-shell的主要功能2、编写一shell脚本并赋执行权限运行【实验步骤】1、验证shell的主要功能例1:$ ls -l >file1把ls命令的输出放到文件file1中,屏幕上不产生任何输出。
如果文件不存在则shell 建立它;否则文件的最初内容被来自ls的输出所替代(即覆盖原有数据)。
可以使用下面的记号把输出添加到一个文件原有内容的后面(称追加)$ ls -l >>file1在这种情况下如果file1 不存在则也建立它。
例2:将标准错误输出重定向到指定文件。
$ ls -l jin 2 >errfile由于名为jin的文件不存在,原来在屏幕上看到的错误信息重定向到errfile文件中;标准错误输出可重定向到指定文件中;其形式可用program 2>filename 。
2、编写一shell脚本,并赋执行权限运行:(1)$ vi aaa.sh // 输入可执行的内容,保存退出(2)$ chmod a +x aaa.sh // 赋可执行权限(3)$ aaa.sh // 运行三、实验分析与小结(实验过程中的问题分析、产生的原因以及解决方法;实验结果分析;有待优化思路)总结分析:1、shell是用户与作业系统之间的交互层,用户修改其环境,设置或取消shell的环境变量,shell的主要任务是:提示用户打入指令,读指令,转换指令为核心所能理解的语言。
操作系统模拟unix文件系统实验报告

操作系统大型实验班级:学号:姓名:一实验介绍……………………………………………………………………1.实验名称2.实验目的3.实验内容及要求二实验环境……………………………………………………………………三实验设计……………………………………………………………………1.数据结构设计2.系统流程设计3.实现命令操作四模块详解……………………………………………………………………1 .文件操作2 .用户操作五实验演示……………………………………………………………………1 .初始化磁盘块2 .用户登录3 .目录操作4 .文件操作六源代码………………………………………………………………………七实验心得体会……………………………………………………………………1.调试中遇到的问题总结2.实验感悟一、实验介绍1.实验名称操作系统大型实验2.实验目的完成一个 UNIX/Linux文件系统的子集的模拟实现,了解Unix文件系统的实现机制。
3.实验内容及要求(1)文件卷结构设计0#块可省略I节点栈及空间为20项块大小为512字节卷盘块数大于100I节点盘块数大于10块(2)I节点结构设计文件大小文件联接计数文件地址文件拥有者文件所属组文件权限及类别文件最后修改时间其中文件地址为六项:四个直接块号,一个一次间址,一个两次间址(3)目录结构用16字节表示,其中14字节为文件名,2字节为I节点号(4)用户及组结构用户信息中包括用户名、口令,所属组,用户打开文件表(5)文件树结构除(4)要求外,适当考虑UNIX本身文件树结构(6)实现功能Ls 显示文件目录Chmod 改变文件权限Chown 改变文件拥有者Chgrp 改变文件所属组Pwd 显示当前目录Cd 改变当前目录Mkdir 创建子目录Rmdir 删除子目录Mv 改变文件名Cp 文件拷贝Rm 文件删除Ln 建立文件联接Cat 连接显示文件内容Vi 文件写入Mk 创建文件umask 查看用户屏蔽码Umask 文件创建屏蔽码Passwd 修改用户口令Ls-l 查看文件类型Login 用户注销Logout 退出系统Help 显示帮助信息二、实验环境实验设备:Microsoft Visual Studio 2010开发语言:c++三、实验设计1.数据结构设计磁盘文件结构设计:用一个名为disk.txt的文件模拟Unix系统磁盘,总共分为200块,每块514个字节(实际可用512个字节,还有2个字节是磁盘分割符‘\n’),使第一块(0#)盘块做为超级块,记录该系统磁盘的使用情况;第二块(1#)盘块——第十三块(12#)盘块作为存储I 结点使用,每个I结点74个字节,所以每个盘块可以存放6个I结点,总共有72个I结点,记录在超级块中;十三块(12#)以后的盘块作为存储文件内容使用,总共187个盘块,用成组连接法记录在超级块中。
北邮 大三下 Unix第二次实验报告

班级:09211311 姓名:schnee 日期:2012-05-27Unix 编程环境实验二shell命令的实现1.实验目的练习使用系统调用函数实现一个shell命令的功能,进一步熟悉进程控制与进程间通信。
2.实验要求使用fork(),exec(),dup2(),pipe() ,open()系统调用完成与下列shell命令等价的功能。
grep –v usr < /etc/passwd | wc –l > result.txt3.相关系统调用说明-创建新进程用fork()- exec系统调用可以用execlp(file,argv0, argv1, …, 0);-创建匿名管道pipe(int fd[2]);其中fd[0]为读端,fd[1]为写端- dup2系统调用用法为dup2(src_fd, dst_fd);src_fd覆盖掉dst_fd-等待子程序结束用wait(&sv); int sv;4.实验代码#include<fcntl.h>#include<sys/types.h>#include<sys/stat.h>#include<sys/wait.h>#include<unistd.h>#include<stdlib.h>#include<string.h>#include<stdio.h>int main(){int sv, fd[2], infile, outfile;char *file;pipe(fd); //创建管道file="/etc/passwd";infile=open(file, O_RDONLY);file="result.txt";outfile=open(file, O_CREAT|O_WRONLY); //打开文件if(fork()==0){dup2(infile, 0); //输入重定向dup2(fd[1], 1);close(fd[1]);close(fd[0]);execlp("grep", "grep", "-v", "usr", 0); //系统调用}else if(fork()==0){dup2(fd[0], 0);dup2(outfile, 1); //输出重定向close(fd[1]);close(fd[0]);execlp("wc", "wc", "-l", 0); //系统调用}close(fd[1]);close(fd[0]); //不加则会死循环wait(&sv);wait(&sv); //不加则会导致僵尸进程return 0;}5.实验结果截图主文件夹下的a.cpp源文件,a可执行文件以及运行结果result.txt文本文件。
unix 实验报告

unix 实验报告UNIX 实验报告一、引言UNIX 是一种操作系统,广泛应用于计算机科学领域。
本实验报告旨在介绍UNIX 操作系统的基本概念、特点和使用方法,并通过实验验证其功能和性能。
二、UNIX 操作系统的基本概念1. UNIX 的起源UNIX 是由贝尔实验室的 Ken Thompson 和 Dennis Ritchie 在 1969 年开发的操作系统。
它最初是为了支持多用户、多任务和分时操作而设计的。
2. UNIX 的特点UNIX 具有以下几个特点:- 可移植性:UNIX 可以在不同的硬件平台上运行,使得软件开发更加灵活。
- 多用户和多任务:UNIX 支持多用户同时使用,并且可以同时运行多个程序。
- 分时操作:UNIX 采用分时操作方式,使得多个用户可以共享计算机资源。
- 强大的命令行界面:UNIX 提供了丰富的命令行工具,使用户可以通过命令完成各种操作。
3. UNIX 的文件系统UNIX 使用层次化的文件系统来组织文件和目录。
文件系统的根目录为 "/",所有的文件和目录都从根目录开始构建。
UNIX 的文件系统采用了一种统一的文件访问方式,用户可以通过文件路径来访问文件。
三、UNIX 操作系统的使用方法1. 登录和注销用户可以通过用户名和密码登录到 UNIX 操作系统。
登录后,可以执行各种命令和操作。
注销时,用户可以使用 "logout" 命令退出系统。
2. 文件和目录操作UNIX 提供了一系列命令来管理文件和目录,如:- "ls" 命令用于列出当前目录下的文件和目录;- "cd" 命令用于切换当前目录;- "mkdir" 命令用于创建新的目录;- "rm" 命令用于删除文件或目录。
3. 进程管理UNIX 允许同时运行多个进程,并提供了一些命令来管理进程,如:- "ps" 命令用于查看当前正在运行的进程;- "kill" 命令用于终止指定的进程。
unix实验报告

unix实验报告Unix实验报告引言Unix操作系统是一种广泛应用于计算机领域的操作系统,具有稳定性、可靠性和灵活性等优势。
本实验旨在探索Unix操作系统的基本特性和功能,以及如何在Unix环境下进行常见的操作和任务。
一、Unix操作系统的概述Unix操作系统诞生于20世纪70年代,由贝尔实验室的Ken Thompson和Dennis Ritchie等人开发。
它采用了分时操作系统的设计理念,支持多用户、多任务和多进程的运行环境。
Unix操作系统以其开放源代码和良好的可移植性,成为了众多计算机系统的首选操作系统。
二、Unix系统的基本命令和操作在Unix系统中,用户可以通过命令行界面或图形界面来操作系统。
本节将介绍一些常见的Unix命令和操作。
1. 文件和目录管理Unix系统以文件和目录的形式来组织和管理数据。
用户可以使用命令如ls、cd、mkdir等来查看、切换目录以及创建新的目录。
2. 文件编辑和查看Unix系统提供了强大的文本编辑工具,如vi和nano。
用户可以使用这些工具来编辑和查看文本文件,进行代码编写和修改。
3. 进程管理Unix系统支持多进程的运行环境,用户可以使用命令如ps、kill等来查看和管理系统中的进程。
这些命令可以帮助用户了解系统的运行情况,并进行必要的进程控制和管理。
4. 网络和通信Unix系统具有强大的网络和通信功能。
用户可以使用命令如ping、ssh等来测试网络连接和进行远程登录。
此外,Unix系统还支持各种网络协议和服务,如FTP、HTTP等。
三、Unix环境下的编程和开发Unix操作系统以其开放的设计理念,成为了许多程序员和开发者的首选平台。
本节将介绍Unix环境下的编程和开发工具。
1. C语言开发Unix操作系统的内核和许多系统工具都是使用C语言编写的。
因此,C语言成为了Unix环境下最常用的编程语言之一。
开发者可以使用Unix系统提供的gcc 编译器来编译和调试C语言程序。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
电子科技大学计算机科学与工程学院标准实验报告(实验)课程名称Unix操作系统电子科技大学教务处制表电子科技大学实验报告一、实验室名称:计算机学院实验中心二、实验项目名称:图书馆管理系统三、实验目的:掌握shell编程的一般方法,能运用常用的shell命令编写一个简单的shell程序,并能在Linux系统所提供的/bin/sh或/bin/bash下正确的运行。
四、实验内容:•写一个菜单驱动的Linux图书馆管理程序(LLIB),该程序能够对书库中的图书执行增加一条记录、删除一条记录、显示一条记录、更新一条记录状态和打印报表等功能。
图书库为一个文本文件library, 其中每一行为一个记录,包括六个字段,描述一种书的六种信息(假设每一种书只能有一本),分别是:•书名•作者•种类,假设有三种有效类型:系统书:简写为system参考书:简写为reference教科书:简写为textbook•状态:表示书被借出还是在书库中。
图书状态由程序决定,当增加一本书时或书被还回时,该状态自动设为in;当书被借出时,状态改为out;•借阅者姓名:当图书在书库中(即状态字段为in)时,该字段为空;当书被借出(即状态字段为out)时,该字段为借阅者姓名;•日期:当图书在书库中(即状态字段为in)时,该字段为空;当书被借出(即状态字段为out)时,该字段为借出日期。
•由于在书名和作者字段的字符串中可能包含空格,所以在每条记录中各字段之间的间隔符为冒号(:)。
程序结构要求:五、实验器材(设备、元器件):• 个人电脑(安装window 10操作系统)• WSL(window 10下的Linux 子系统)• cmder(windows 10下的命令行)六、实验步骤及操作:代码:#!/bin/rbash# 记录的借出状态STATUS_AVAILABLE=0STATUS_UNAVALABLE=1# 加粗输出第一个参数function echoBold() {echo -e "\033[0;0;1m$1\033[0;0;0m"}# 输出标题 附带第一参数function echofunctionTitle() {echo -e Linux Library - `echoBold $1`}# 读输入直到正确选择yes 或者nofunction yesOrNo() {input=""while true # 等待正确输入doread -p "$1Y(es) or N(o)?>" inputcase "$input" inLLIB ADD DISPLAY UPDATE DELETE ERROR EDIT REPORTSREPORT_NOyes|yeS|yEs|yES|Yes|YeS|YEs|YES|Y|y)return 1 # 选择‘是’;;no|No|NO|nO|N|n)return 0 # 选择‘否’;;*);; # 无法识别的输入继续循环等待输入esacdone}# 欢迎界面function welcome() {clearecho -e `echoBold "Linux Library Manager"`echo -e "This is the Linux Library application\nPlease enter any key to continue..."read -n 1 # 等待任意一个字符的输入}# 展示主菜单function showMenu() {clearechofunctionTitle "MAIN MENU"echo 0: `echoBold EXIT` this programecho 1: `echoBold EDIT` showMenuecho 2: `echoBold REPORTS` Menu}# 输入错误显示function onWrongInput() {clearecho -e Wrong Input. Try again.echo -e "Press any key to continue...>\c"read -n 1}# 添加一本书function addABook() {clearechofunctionTitle "ADD MODE"title=""author=""category=""while test -z "$title"doread -p "Title: " title # 读入非空标题donewhile test -z "$author"doread -p "Author: " author # 读入非空作者doneread-p "Category (system(sys)|reference(ref)|textbook(tb): "categorywhile truedocase"$category"insystem|sys)category="system"# 规范化存储的类别break;;reference|ref)category="reference"# 规范化break;;textbook|tb)category="textbook"# 规范化break;;*) # 输入不在限定的类别之中echo Wrong category. Please input again.read -p "Category (system(sys)|reference(ref)|textbook(tb): " category;;esacdone# 检测是否已经存在该条书目信息记录line=$(grep -E "${title}:${author}:[^:]*:[01]:[^:]*:[^:]*" library |wc -l)# 存在该条记录不允许添加if [ $line -gt 0 ]thenecho"error: the book exists"elseecho"${title}:${author}:${category}:${STATUS_AVAILABLE}::" >> libraryfi}# 根据一行记录打印信息function showBookInfo() {# 以:为分割符取出书的具体信息title=`echo $1 | cut -d ":" -f 1`author=`echo $1 | cut -d ":" -f 2`category=`echo $1 | cut -d ":" -f 3`status=`echo $1 | cut -d ":" -f 4`echo""echo"Title: $title"echo"Author: $author"echo"Categoty: $category"# 展示状态信息if [ "$status" == "$STATUS_AVAILABLE" ]thenecho Status: inif [ "$2" == "u" ] # 带有参数2,并且为u,打印更新相关信息thenecho New status: outfielseecho Status: outif [ "$2" == "u" ]thenecho New status: infiecho""echo Checked out by: `echo $1 | cut -d ":" -f 5`echo Date: `echo $1 | cut -d ":" -f 6`fiecho""return $status}# 删除一本书function deleteABook() {clearauthor=""read -p "Enter the title>" title# 查找记录中书名符合的行数line=`grep -E "${title}:[^:]*:[^:]*:[01]:[^:]*:[^:]*" library |wc -l`# 多于一行,需要再指定作者来消除冲突if [ $line -lt 1 ]thenecho no such bookread -p "Any key to return" -n 1return# 少于一行,说明不存在elif [ $line -gt 1 ]thenecho $line books named title found. Please specify the authorread -p "Enter the author>" authorfiinfo=":::::"if [ "$author" != "" ] # 有指定作者名,以书名和作者名查找,取第一条theninfo=`grep -E "${title}:${author}:[^:]*:[01]:[^:]*:[^:]*" library | head -n 1`elseinfo=`grep -E "${title}:[^:]*:[^:]*:[01]:[^:]*:[^:]*" library` fiif [ info == ":::::" ] || [ info == "" ]thenecho no such bookread -p "Any key to return>" -n 1returnelseechofunctionTitle "DELETE MODE"showBookInfo $infofiyon=1while truedoyesOrNo "Delete this book? "yon=$?if [ $yon = 1 ]thenif test -n authorthengrep -v "${title}:${author}:[^:]*:[01]:[^:]*:[^:]*"library > tmpelsegrep -v "${title}:[^:]*:[^:]*:[01]:[^:]*:[^:]*" library > tmpfi# 删除mv tmp librarybreakelif [ $yon = 0 ]thenbreakfidone}# 展示查找书目function displayABook() {clear# 查找方式同上# title有冲突需要指定作者author=""read -p "Enter the title>" titleline=`grep -E "${title}:[^:]*:[^:]*:[01]:[^:]*:[^:]*" library |wc -l`if [ $line -lt 1 ]thenecho no such bookread -p "Any key to return" -n 1returnelif [ $line -gt 1 ]thenecho $line books named $title found. Please specify the authorread -p "Enter the author>" authorfiinfo=":::::"if [ "$author" != "" ]theninfo=`grep -E "${title}:${author}:[^:]*:[01]:[^:]*:[^:]*" library | head -n 1`elseinfo=`grep -E "${title}:[^:]*:[^:]*:[01]:[^:]*:[^:]*" library` fiif [ info == ":::::" ] || [ info == "" ]thenecho no such bookread -p "Any key to return>" -n 1returnelseechofunctionTitle "DISPLAY MODE"showBookInfo $infofi}# 更新书目状态function updateABook() {clearauthor=""read -p "Enter the title>" titleline=`grep -E "${title}:[^:]*:[^:]*:[01]:[^:]*:[^:]*" library |wc -l`if [ $line -lt 1 ]thenecho no such bookread -p "Any key to return" -n 1returnelif [ $line -gt 1 ]thenecho $line books named $title found. Please specify the authorread -p "Enter the author>" authorfiinfo=":::::"if [ "$author" != "" ]theninfo=`grep -E "${title}:${author}:[^:]*:[01]:[^:]*:[^:]*" library | head -n 1`elseinfo=`grep -E "${title}:[^:]*:[^:]*:[01]:[^:]*:[^:]*" library` fiif [ info == ":::::" ] || [ info == "" ]thenecho no such bookread -p "Any key to return>" -n 1returnfiechofunctionTitle "UPDATE MODE"showBookInfo $info uoldStatus=$?echo oldStatus=$oldStatus #记录旧状态(在展示书目信息里返回)yesOrNo "Update? "yon=$?if [ $yon -eq 1 ]then# 确定更新# 删除旧记录,并提取信息grep -v "$info" library > tmpmv tmp librarytitle=`echo $info | cut -d ":" -f 1`author=`echo $info | cut -d ":" -f 2`category=`echo $info | cut -d ":" -f 3`if [ "$oldStatus" == "$STATUS_UNAVALABLE" ]then# 无需借出人信息,借出时间echo"${title}:${author}:${category}:${STATUS_AVAILABLE}::" >> library else# 更新为借出状态,需要输入借出人姓名# 使用系统时间date=`date "+%Y-%m-%d-%H-%M"`name=""while [ "$name" == "" ]doread -p "input name(@$date)>" namedone# 输出到库文件echo"${title}:${author}:${category}:${STATUS_UNAVALABLE}:${name}:${date}" >> libraryfifi}# 展示所有书目function reportAllBooks() {# 排序栏位置起始let start=$1-1end=$1# 临时文件,需要新创建,所以删除已经存在的if [ -f report ]thenrm -rf reportfi# 排序后用showBookInfo输出并重定向到临时文件sort -t ":" +$start -$end library | while read linedoshowBookInfo $line >> reportdone# 展示内容more reportread -n 1 -p "Any key to continue>"# 展示结束删除临时文件rm -rf report}# 展示的菜单function reportMenu() {while truedoclearechofunctionTitle "REPORTS MENU"# 排序方式echo 0: `echoBold RETURN`echo 1: Sorted by `echoBold TITLES`echo 2: Sorted by `echoBold AUTHOR`echo 3: Sorted by `echoBold GATEGORY`read -p "Enter your choice>" chif [ "$ch" == 0 ]thenreturnelif [ "$ch" == 1 ] || [ "$ch" == 2 ] || [ "$ch" == 3 ]then# 传入排序方式reportAllBooks $chbreakelseonWrongInputfidone}# 展示编辑选项菜单function showEditMenu() {clearechofunctionTitle "EDIT MENU"echo 0: `echoBold RETURN` to the main menuecho 1: `echoBold ADD`echo 2: `echoBold "UPDATE STATUS"`echo 3: `echoBold DISPLAY`echo 4: `echoBold DELETE`}# 编辑选项菜单功能控制function onEditMenu() {clearopt=""# 保存选择的操作until [ "$opt" == "0" ]doshowEditMenuread -p "Enter your choice>" optcase"$opt"in"0");;"1")yon=1 # 控制是否继续添加while truedoif [ $yon -eq 1 ] # 输入yes,继续添加thenaddABookyesOrNo "Any more to add? "yon=$?elsebreak# 输入no,退出循环fidone;;"2")yon=1 # 控制是否继续更新while truedoif [ $yon -eq 1 ] # 输入yes,继续更新thenupdateABookyesOrNo "Any more to update? "yon=$?elsebreak# 输入no,推出循环fidone;;"3")yon=1 # 控制是否继续查找while truedoif [ $yon -eq 1 ] # 输入yes,继续查找thendisplayABookyesOrNo "Any more to look for? " yon=$?elsebreak# 输入no,停止查找fidone;;"4")yon=1 # 控制是否继续删除while truedoif [ $yon -eq 1 ] # 输入yes,继续删除thendeleteABookyesOrNo "Any more to delete? "yon=$?elsebreak# 输入no,停止删除fidone;;*)onWrongInput;; # 不符合要求的输入esacdone}if [ ! -f library ]thentouch libraryfi# 主程序,循环控制主菜单welcomeoption=""until [ "$option" == "0" ]doshowMenuread -p "Enter your choice>" optioncase"$option"in0);;1)onEditMenu;;2)reportMenu;;*)onWrongInput;;esacdone七、实验数据及结果分析:由于WSL的兼容性问题,这里借了一下同学的电脑进入程序:按任意键进入主菜单:输入非0 1 2 3 时:编辑界面:添加一本图书:更新状态:查询书的状态:删除一本书:查询所有的书(标题排序):查询所有的书(作者排序):查询所有的书(按类型排序):八、实验结论:已基本实现要求功能。