实验三实现简单的Shell程序
实验三Shell和Vi编辑器

1+2+3+...+99+100=5050
[student@enjoy abc]$
[student@enjoy abc]$
4)从如上内容的基础上总结vi的启动、存盘、文本输入、现有文件的打开、光标移动、复制/剪贴、查找/替换等命令。
5)编写一个程序解决“鸡兔同笼”问题。
main()
{
int i,sum=0;
for(i=0;i<=100;i++)
{
sum=sum+i;
}
printf("\n1+2+3+...+99+100=%d\n",sum);
}
[student@enjoy abc]$ gcc -o abc abc.c
[student@enjoy abc]$ ls
abc abc.c
再次查看文件list中的内容,和前两次的结果相比较,注意list文件大小和创建时间的区别,完成课后第一题。
(2)输入重定向
使用输入重定向,把上面生成的文件list用mail命令发送给自己:#mail root < list。
查看新邮件,看看收到的新邮件中其内容是否为list文件中的内容。
(3)管道
利用管道和grep命令,在上面建立的文件list中查找字符串list:#cat list | grep list。
显示别名ls代表的命令,确认设置生效:#alias ls。
使用别名ls显示当前目录中的文件列表。
在使定义的别名不失效的情况下,使用系统的ls命令显示当前目录的命令列表:#\ls。
实验指导书--实验03 Linux Shell编程

实验三: Linux Shell编程
实验学时: 2
实验类型: 设计
实验要求: 必修
一、实验目的
通过本实验的学习, 使学生掌握Shell编程的基本方法。
二、实验内容
实验内容: Linux Shell实现题目所要求的功能。
三、实验原理、方法和手段
无
四、实验组织运行要求
以学生自主训练为主的开放模式组织教学
五、实验条件
PC机
六、实验步骤
1.编写一个Shell脚本, 完成以下功能:
1)显示文字“Waiting for a while….”
Vi helloworld
#!/bin/bash
Echo “Waiting for a while….”
2)显示当前目录下面扩展名为”.h”的文件和目录, 并输出重定向到/home/file.txt文件
Find .h
Find .h >>/home/file.txt
提示: 显示文字可使用echo命令, 搜索文件可使用find命令
2.编写一个Shell脚本, 完成以下功能
计算8以内(含8)不是3的整数倍的数字的和
3.编写一个Shell脚本, 在当前目录创建5个目录, 目录的命名形式分别为: dir-1, dir-2, …., dir-5
七、思考题
比较C语言和Shell编程的一些异同点。
八、实验报告
实验预习: 学习shell编程的基本方法
实验记录: 记录解决问题所用的代码和运行结果
实验报告: 提交代码和运行结果
九、其它说明。
操作系统原理实验5-实现一个简单的Shell

《操作系统原理》实验报告
实验序号:5 实验项目名称:实现一个简单的Shell
一、实验目的及要求
1. 加深对操作系统Shell的理解。
2. 理解进程控制的思想。
3. 深入掌握Linux操作系统下的进程控制编程。
二、实验设备(环境)及要求
1.虚拟机VMware Workstation、Ubuntu操作系统和C语言编程。
2.设计思路:Shell建立一个新的进程,然后在那个进程中运行一个程序(如完成ls操作)然后等待那个进程执行结束。
然后shell便可读取新的一行输入,建立一个新的进程,在这个进程中运行程序并等待这个进程结束。
所以要写一个shell,需要循环以下过程:
a. 获取命令行
b. 解析命令行
c. 建立一个子进程(fork)
d. 替换子进程(execvp)
e. 父进程等待子进程退出(wait)。
三、实验内容与步骤
主要代码
解析并执行指令
输出各进程的信息
四、实验结果与数据处理
五、分析与讨论
六、教师评语
成绩
签名:
日期:。
linux shell实验报告

linux shell实验报告《Linux Shell实验报告》摘要:本实验报告主要介绍了在Linux操作系统中使用Shell进行实验的过程和结果。
通过实验,我们深入了解了Shell的基本概念、常用命令和操作技巧,同时掌握了Shell脚本编写和执行的方法。
实验结果表明,Shell在Linux系统中具有重要的作用,能够提高工作效率和操作便利性。
一、实验目的本实验旨在通过实际操作,加深对Linux Shell的理解和掌握,探索Shell在Linux系统中的应用和作用。
二、实验内容1. Shell的基本概念在实验中,我们首先了解了Shell的基本概念,包括Shell是什么、其作用和特点等内容。
通过实际操作,我们发现Shell是一种命令行解释器,能够接收用户输入的命令并将其转化为操作系统能够理解的指令,从而实现对系统资源的管理和控制。
2. 常用Shell命令在实验中,我们学习了一些常用的Shell命令,如cd、ls、mkdir、rm等,以及它们的用法和功能。
通过实际操作,我们发现这些命令能够帮助我们在Linux 系统中进行文件和目录的管理,实现对系统资源的快速访问和操作。
3. Shell脚本编写和执行在实验中,我们还学习了如何编写和执行Shell脚本。
通过实际操作,我们发现Shell脚本能够帮助我们实现对一系列命令的批量执行,从而提高工作效率和操作便利性。
三、实验结果通过实验,我们深入了解了Shell的基本概念、常用命令和操作技巧,同时掌握了Shell脚本编写和执行的方法。
实验结果表明,Shell在Linux系统中具有重要的作用,能够提高工作效率和操作便利性。
四、结论本实验通过实际操作,加深了对Linux Shell的理解和掌握,探索了Shell在Linux系统中的应用和作用。
通过实验,我们发现Shell在Linux系统中具有重要的作用,能够提高工作效率和操作便利性,对于Linux系统的管理和维护具有重要的意义。
实验三 shell编程

实验三 shell编程一、实验名称:shell编程二、实验学时:2学时三、实验目的掌握shell脚本的多种常用的执行方式;熟悉shell编程常用语法格式和变量的使用方法;掌握shell编程中常用的循环语句、分支语句、条件语句的使用方法。
四、实验步骤1.利用gedit编辑器,在当前用户的家目录下建立一个简单的脚本文件file.sh,其中包括date,cal,pwd,ls 等常用命令,然后以不同方式执行该脚本。
(1)采用输入定向到shell脚本的方法执行:输入命令 bash<file.sh(2)不给shell脚本文件可执行权限a)source FileName作用:在当前bash环境下读取并执行FileName中的命令。
该filename文件可以无"执行权限"注:该命令通常用命令“.”来替代。
如:source bash_profile . bash_profile两者等效。
source(或点)命令通常用于重新执行刚修改的初始化文档。
source命令(从 C Shell 而来)是bash shell的内置命令。
点命令(点符号),从Bourne Shell而来,就是顺序的执行文件里的命令而已。
b)sh和bash命令用法: shFileName bash FileName作用:在当前相应的bash环境下新建一个子shell读取并执行FileName中的命令。
该filename文件可以无"执行权限" 。
注:两者在执行文件时的不同,是分别用自己的shell来跑文件。
sh使用“-n”选项进行shell脚本的语法检查,使用“-x”选项实现shell脚本逐条语句的跟踪,可以巧妙地利用shell的内置变量增强“-x”选项的输出信息等。
(3)修改shell脚本的权限为可执行(chmod +x file.sh)a)./的命令用法:./FileName作用:打开一个子shell来读取并执行FileName中命令。
shell系统实验报告

shell系统实验报告《Shell系统实验报告》摘要:本实验通过对shell系统的学习和实践,对shell脚本编程进行了深入的研究和探讨。
通过实验,我们深入了解了shell系统的基本概念、语法和功能,并通过实际编程实践加深了对shell脚本的理解和掌握。
本实验报告将对实验过程、实验结果和实验感想进行详细的介绍和分析。
一、实验目的通过本次实验,我们的主要目的是深入了解shell系统的基本概念和语法,掌握shell脚本编程的基本方法和技巧,提高对Linux系统的操作和管理能力。
二、实验过程1. 学习shell系统的基本概念和语法规则;2. 编写简单的shell脚本,包括文件操作、流程控制、函数定义等;3. 运行和调试编写的shell脚本,检验脚本的正确性和可靠性;4. 分析实验结果,总结实验感想。
三、实验结果通过本次实验,我们深入了解了shell系统的基本概念和语法规则,掌握了shell 脚本编程的基本方法和技巧。
我们成功编写了一些简单的shell脚本,包括文件操作、流程控制、函数定义等,通过运行和调试这些脚本,我们验证了它们的正确性和可靠性。
实验结果表明,我们对shell系统有了更深入的认识和理解,对Linux系统的操作和管理能力得到了提高。
四、实验感想通过本次实验,我们对shell系统有了更深入的认识和理解,对Linux系统的操作和管理能力得到了提高。
我们深刻体会到了shell脚本编程的重要性和实用性,相信在今后的工作和学习中,我们会更加熟练地运用shell系统,提高工作效率和解决实际问题。
同时,我们也意识到了自己在shell系统方面的不足之处,今后需要进一步学习和实践,不断提高自己的技能水平。
综上所述,本次实验对我们的学习和成长都具有重要意义,我们将继续努力学习和提高自己,在shell系统和Linux系统方面取得更大的进步和成就。
实验三vi及Shell程序设计

实验三vi及Shell程序设计实验三 vi及Shell程序设计⼀、实验任务第⼀部分 vi1.请在/tmp⽬录下建⽴⼀个名为vitest的⽬录;(请书写命令)[root@localhost /]# mkdir /temp/vistest2.进⼊vitest⽬录;[root@localhost /]# cd /tmp/vistest3.将/etc/man.config复制到本⽬录下;[root@localhost vistest]# cp /etc/man.config /tmp/vistest4.使⽤vi开启本⽬录下的man.config⽂件;[root@localhost vistest]# vi man.config5.在vi中设定⾏号;:set number6.移动到第58⾏,向右移动40个字符,请问看到什么⽬录?/dir/bin/foo7.移到第1⾏,并向下搜寻bzip2字符串,请问它在第⼏⾏?第118⾏8.将50到100⾏之间的man改为MAN,如何实现?:50,100s/man/MAN/gc9.修改完后,想全部复原,怎么样实现?:q!或者⼀直按u10.复制65到73⾏这9⾏的内容,并粘贴到最后⼀⾏之后;先按“65G”使光标移到65⾏,再按“9yy”,然后按“G”回到再回到最后⼀⾏,按“P”,就可以完成操作。
11.删除21到42⾏之间的开头为#符号的批注数据,如何实现?“21G”之后,再⽤“22dd”即可删除22⾏12.将这个⽂件另存为man.test.config⽂件;13.转到第27⾏,并删除15个字符,结果出现的第⼀个单词是什么?14.在第⼀⾏新增⼀⾏,输⼊I am a student,怎样实现?15.保存后退出。
第⼆部分 Shell程序设计1.请编写⼀个Shell脚本,当执⾏该脚本的时候,该脚本可以显⽰:1)你⽬前的⾝份(⽤USER)2)你⽬前所在的⽬录(⽤PWD)2. 请编写⼀个Shell脚本,该程序可以计算“你还有多少天可以过⽣⽇”。
linuxshell编程实验总结

Linux Shell 编程实验总结1.引言本文档总结了在学习Li nu xS he ll编程过程中的实验经验和心得体会。
通过对L in ux Sh el l编程实验的实施和总结,我们能够更好地理解S h el l脚本的运行机制,掌握Sh el l脚本的基本语法和常用命令,提高编写高效、精确的Sh e ll脚本的能力。
2.实验一:S hell 脚本基础2.1实验目的本实验旨在帮助学员熟悉Sh el l脚本的基本语法和常用命令,掌握脚本的编写与执行方法。
2.2实验内容在本实验中,我们学习了如何编写具有特定功能的Sh el l脚本,如输出H el lo Wo rl d、计算两个数之和、判断文件是否存在等。
2.3实验心得通过本实验的实施,我对Sh el l脚本的基本语法有了更深入的理解。
在编写脚本的过程中,我发现使用变量、条件判断和循环结构可以极大地提高脚本的灵活性和实用性。
同时,我也加深了对常用命令的认识和掌握,如e ch o、re ad、i f-e ls e、fo r循环等。
这些基本的知识将为后续的实验和项目实践打下坚实的基础。
3.实验二:文件和目录操作3.1实验目的本实验旨在帮助学员了解Li nu x文件系统的基本操作,掌握S he ll脚本中与文件和目录相关的命令。
3.2实验内容在本实验中,我们学习了如何创建、复制、重命名和删除文件、目录,以及如何查询文件和目录的属性信息等。
3.3实验心得通过本实验的实施,我对Li nu x文件系统有了更深入的了解。
我学会了如何使用S he ll脚本快速处理文件和目录,并且能够根据需求编写相应的脚本来操作文件。
例如,通过使用fi n d命令来查找文件,使用g r ep命令来搜索文件内容等。
这些技能在日常工作中非常有用,能够提高工作效率和准确性。
4.实验三:文本处理4.1实验目的本实验旨在帮助学员掌握Sh el l脚本中处理文本的常用命令和技巧,能够快速有效地处理常见的文本数据。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
8/36
信号与进程同步的信号量机制概念不同,理解为一 种传递消息的进程通信类型。
11/36
3.2 基础知识 - 进程通信2
管道
管道允许一条命令的标准输出作为一条命令的标准输 入,允许同一个系统上的两个相关的进程进行通信 (典型情形是父子进程),而且进程的通信是单向的。 管道的语义如图:
12/36
为特定的形式传递给系统调用execve(); c) 由终端进程调用fork()函数建立一个子进程; d) 终端进程本身调用wait4()挂起当前进程来等待子进程完成(后
台命令除外)。子进程通过调用execve( )运行,根据命令名到 目录中查找有关文件(命令解释程序构成的文件),将它调入 内存,执行这个程序(解释命令); e) 如果是后台命令符号(以&结尾),不用调用wait4()进行等待 而是直接提示用户输入下一条命令,转到a),否则调用wait4( ) 等待子进程完成。
3.2 基础知识 – 接口介绍6
6. 建立管道 int pipe(int fildes[2])
相关函数 mkfifo,popen,read,write,fork 接口功能:创建一个管道,把管道的读和写文件描述符放到数
组fildes中, filedes[0]为管道里的读取端,filedes[1]则为管道 的写入端。 返回值 : 若成功则返回零,否则返回-1,错误原因存于errno中。
13/36
3.2 基础知识 – 接口介绍1
范例
#include<unistd.h> main() {
if(fork() = =0) {
printf(“This is the child process\n”); }else{
printf(“This is the parent process\n”); } } 执行 this is the parent process
26/36
3.2 基础知识 – 接口介绍8
范例
#include<unistd.h> #include<signal.h> void show_handler(struct sigaction * act) {
switch (act->sa_flags) { case SIG_DFL:printf(“Default action\n”);break; case SIG_IGN:printf(“Ignore the signal\n”);break; default: printf(“0x%x\n”,act->sa_handler); } }
Shell调用系统核心的大部分功能来执行程序、建立文件并以 并行的方式协调各个程序的运行。
Shell:如何输入命令运行程序以及如何在程序之间通过 shell的一些参数提供便利手段来进行通讯。
4/36
3.2 Shell基本执行原理
Shell程序执行过程
a) 读取用户输入的命令行; b) 解析命令,按照命令名查找并调用系统文件,将其它参数封装
3.2 基础知识 - 文件描述符
标准文件和文件描述符表
每个进程都有一张它所打开的文件描述符表
9/36
3.2 基础知识 - 输入输出重定向
输入重定向后命令的输入来自于输入文件 输出重定向后命令的输出是输出到文件
10/36
3.2 基础知识 - 进程通信1
信号
信号允许一个进程在某一事件发生时与另一个进程 (接收者进程)通信,该进程把事件对应的消息传递 给接收者进程,接收者进程收到一个信号时,会采取 某些相应的动作。信号的值表明发生了哪种事件。
Linux提供系统调用,让用户进程能调用内核代码的运 行。这些系统调用允许用户操纵进程、文件和其他系统 资源,从用户级切换到内核级。
系统调用与普通函数调用的区别在于系统调用的执行会 引起特权级的切换,是一种受约束的、为切换到保护核 心的“函数调用”。
7/36
3.2 基础知识 - 文件描述符
相关函数: wait,fork 接口功能:类似于函数wait,但允许用户等待某个进程组的特
定进程,并可以设置等待选项,例如 WNOHANG。 返回值: 如果执行成功则返回子进程识别码(PID),如果有错误
发生则返回-1。失败原因存于errno中。 范例:参考wait()
21/36
3.2 基础知识 – 接口介绍5
实验三:实现简单的Shell 程序
缪海波
2013年8月
实验目的 准备知识 实验内容
2/36
3.1 实验目的
用C语言实现简单的shell程序
学习使用Linux的系统调用,对进程进行管理和完 成进程之间的通信(用信号和管道进行进程间通信)
熟悉使用Linux下的软件开发工具gcc
23/36
3.2 基础知识 – 接口介绍6
范例 /* 父进程借管道将字符串“hello!\n”传给子进程并显示*/
#include <unistd.h> main() {
int filedes[2]; char buffer[80]; pipe(filedes); if(fork()>0){/* 父进程*/ char s[ ] = “hello!\n”; write(filedes[1],s,sizeof(s)); }
printf(“This is the child process .pid =%d\n”,getpid()); exit(5); }
19/36
3.2 基础知识 – 接口介绍3
else{
} }
sleep(1); printf(“This is the parent process ,wait for child...\n”; pid=wait(&status); i=WEXITSTATUS(status); printf(“child’s pid =%d .exit status=^d\n”,pid,i);
24/36
else{ /*子进程*/ read(filedes[0],buffer,80); printf(“%s”,buffer); } }
执行 hello!
3.2 基础知识 – 接口介绍7
7. 复制文件描述词 int dup2(int fildes, int fildes2)
相关函数:open,close,fcntl,dup 接口功能:把fildes文件描述符复制到fildes2。如果fildes2已
执行 This is the child process.pid=1501 This is the parent process .wait for child... child’s pid =1501,exit status =5
20/36
3.2 基础知识 – 接口介绍4
4. 等待子进程中断或结束 pid_t waitpid(pid_t pid, int*stat_loc, int options);
相关函数:waitpid,fork 接口功能:如果有退出的子进程,则返回退出的子进程的状态;
如果没有任何子进程在运行,则返回错误;如果当前有子进程 正在运行,则函数会一直阻塞直到有一个子进程退出。 返回值 :如果执行成功则返回子进程识别码(PID),如果有错误 发生则返回-1。失败原因存于errno中。
this is the child process
14/36
3.2 基础知识 – 接口介绍1
15/36
3.2 基础知识 – 接口介绍2
2. 执行文件 int execvp(const char *file ,char * const argv [ ]);
相关函数fork,execl,execle,execlp,execv,execve 接口功能:execvp()会从PATH 环境变量所指的目录中查找符
char * argv[ ] ={ “ls”,”-al”,”/etc/passwd”,0}; execvp(“ls”,argv); }
执行 -rw-r--r-- 1 root root 705 Sep 3 13 :52 /etc/passwd
17/36
3.2 基础知识 – 接口介绍3
3. 等待子进程中断或结束 int wait (int* stat_loc) ;
18/36
3.2 基础知识 – 接口介绍3
范例
#include<stdlib.h> #include<unistd.h> #include<sys/types.h> #include<sys/wait.h> main() {
pid_t pid; int status,i; if(fork()= =0){
5. 正常结束进程 void exit(int status)
相关函数:_exit,atexit,on_exit 接口功能:exit()用来正常终结目前进程的执行,并把参
数status返回给父进程,而进程所有的缓冲区数据会自动 写回并关闭未关闭的文件。 范例:参考wait ( )
22/36
5/36
3.2 基础知识
系统调用 文件描述符 输入输出重定向 进程间的通信机制(信号、管道)
6/36
3.2 基础知识 - 系统调用
Linux所有系统资源被内核管理,任何涉及访问系统资源 的用户请求或应用程序请求,必须由内核代码处理。出 于安全考虑,用户进程是不能随意访问内核代码的。