Chapter9-可编程的shell、shell变量和环境.ppt_第1页
Chapter9-可编程的shell、shell变量和环境.ppt_第2页
Chapter9-可编程的shell、shell变量和环境.ppt_第3页
Chapter9-可编程的shell、shell变量和环境.ppt_第4页
Chapter9-可编程的shell、shell变量和环境.ppt_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Unix/Linux编程,北京化工大学 信息科学与技术学院计算机系 易军凯 ,第九章 可编程的shell 、shell变量和环境:编 写自己的shell,概念与技巧:,Unix shell是一种编程语言 什么是shell脚本语言?shell如何处理脚本语言? shell如何处理结构化的工作?exit(0)=success 为什么需要shell变量以及如何使用shell变量 什么是环境?它是如何工作的?,相关系统调用:,exit getenv,相关命令:,env,9.1 shell编程 9.2 什么是以及为什么要使用shell脚本语言 9.3 smsh1-命令行解析 9.4 shell的流程控制 9.5 shell变量:局部和全局 9.6 环境:个性化设置 9.7 已实现的shell的功能,主要内容:,Shell程序,一般称之为设shell脚本,是Unix的重要组成部分,Unix的引导程序和很多管理程序都使用shell脚本。,Shell是一个编程语言解释器,这个解释器解释从键盘输入的命令,也解释存储在脚本中的命令序列. shell脚本是一个包含一系列命令的文件,运行一个脚本就是运行这个文件中的每个命令.,9.1 shell编程,9.2 什么是以及问什么要使用shell脚本语言,Sh的编程特征:变量、I/O和ifthen 脚本中除了命令之外还包括以下元素: 1 变量 脚本中可以定义变量,在script2中,定义了名为 BOOK和NAME两个变量 2 用户输入 read命令告诉shell要从标准输入中读入一个 字符串 3 控制 这个脚本中包括ifthenelseif控制语句,另外还 有while、case和for 4 环境 脚本使用一个名为HOME的变量.HOME的值是你 主目录的路径,9.3 smsh1-命令行解析,shell的主函数: int main() char *cmdline,*prompt,*arglist; int result; void setup(); prompt=DEL_PROMPT; setup(); while(cmdline=next_cmd(propmt,stdin)!=NULL) if(arglist=splitline(cmdline)!=NULL) result=execute(arglist); freelist(arglist); free(cmdline); return 0; ,一个有信号,通出和解析的shell,从输入流中读入一个命令,将一个字符串分解为字符串数组,并返回这个数组,使用fork、execvp、wait来运行一个命令,9.3 smsh1命令行解析,9.4.1 if语句做些什么? 答案:条件检测 程序如何表示成功 (1)exit(0)表示成功 grep程序调用函数exit(0)来表明成功.所有的Unix程序都遵从以0退出表明成功这一惯例.比如,diff命令用来比较两个文本文件.类似地,mv.cp和rm都以相同的方式表明成功. (2)带有else的if语句 else部分就像then部分一样,可以包含任意数量的命,9.4 shell的流程控制,9.4.2 if是如何工作的?,If 语句的工作流程主要如下: (1)shell运行if之后的命令 (2)shell检查命令的exit 状态 (3)exit为0表示成功,非0表示失败 (4)如果成功,shell执行then部分的代码 (5)如果失败,shell执行else部分的代码 (6)关键字fi表示if 结束,令,包括其他的ifthen 语句.if语句还有另一个特征.如果if后的条件是一系列的命令,那么最后一个命令的exit值被用作这个语句块的条件值,并由此来决定条件是否成立.,1、增加一层:process smsh1的控制流从splitline直接到fork,每个命令都被直接传给exec.新的版本中,以if.then或者fi开始的行和条件失败时then语句块中的命令行不传给exec.添加if语句后使命令处理变得复杂,所以要写一个名为process的函数来包含这些复杂的代码.,9.4.3 在smsh中增加if,2、process做些什么 process通过寻找关键字,比如if.then和fi,来管理脚本流程,在适当的时候调用fork和cess必须记录条件命令的结果以便能够处理then和else块. 3、process是如何工作的? 代码区域、 运行状态,Process通过3个函数来处理区域问题: (1)is_control_command (2)do_control_command (3)ok_to_execute,smsh2.c,int main() char *cmdline,*prompt,*arglist; int result,process(char *); void setup(); prompt=DEL_PROMPT; setup(); while(cmdline=next_cmd(propmt,stdin)!=NULL) if(arglist=splitline(cmdline)!=NULL) result=execute(arglist); freelist(arglist); free(cmdline); return 0; void setup() void fatal(char*s1,char*s2,int n),process.c #include #include “smsh.h” int is_control_commmand(char*) int do_control_command(char*) int ok_to_execute() int process(char*arge) controlflow.c #include #include “smsh.h” int syn_err(char*); int ok_to_execute(); int is_control_command(char*s) int do_control_commmand(char*args) int syn_err(char *msg),添加两个新 文件,shell包括两类变量:局部变量和环境变量,9.5.1 使用shell变量,9.5 shell变量:局部和全局,变量名是字符AZ,az,09和_的组合.第一个字母不能是数字.变量名对大小写敏感. 变量的值是字符串.变量都是字符串类型的,没有数值类型的变量.所有的操作都是字符串操 列出所有变量使用set命令. Set命令列出当前shell定义的所有变量.,9.5.2 变量的存储,1、模型 要在shell里增加变量,必须有个地方能存放这些变量的名称和值,而且这个变量存储系统必须能够分辨局部和全局变量. 2、接口 VLtore(char*val,char *val)增加/更新var=val VLookup(char *var)取得var的值 VList输出列表到stdout 3、实现 可以用链表,hash表,树或者是几乎任何数据结构来实现它,9.5.3 增加变量命令:Built-ins,修改process函数,使之在调用fork/exec之前检查是否为内置的命令,修改后的效果: 可以正常工作了 TZ没有传给Date 变量$temp和$day的值没有正确显示,向smsh中添加内置命令,9.6.1 使用环境 人们喜欢按照自己的喜好设置自己的电脑,环境不是shell的一部分,但是shell包括一些可以让用户读取和修改环境的命令.学习它怎么工作,加到实现的代码中. 1、列出环境 env命令列出当前所有环境设置.env是一个普通的程序,而不是shell内置的命令. 2、更新环境 (1) var=value 通过变量赋值就可以更新环境 (2) export var 使用shell内置的命令向环境添加新的变量 (3) 在C程序中读入环境 使用标准的C库函数gentenv也可以得到环境变量的值.,9.6 环境:个性化设置,9.6.2 什么是环境以及它如何工作,环境是每个程序都可以存取的一个字符串数组,每个数组中的字符串都以var=value这样的形式出现,数组的地址被存放在一个名为environ的全局变量里.环境就是environ指向的字符串数组,读环境就是读这个字符串数组,改变环境就是改变字符串,改变这个数组中的指针或者将这个全局指针指向其他数组,环境是一个指向字符串的指针数组,1、例子:showenv.c功能就像命令env:,extern char *environ; main() int I; for(I = 0; environi; i+) printf(“%sn”,environi); ,main() char *table3; table0 = “TERM = vt100”; table1 = “HOME = /on/the/range”; table2 = 0; environ = table; execlp( “env”,”env”,NULL); ,Changeenv.c改变环境,然后运行env:,2、但是exec清除了所有的数据 对exec系统调用就像换脑,用目标程序的代码和数据替换调用程序的代码和数据.但是environ指针指向的数组是惟一的例外,当内核执行系统调用execve时,它将数组和字符串复制到新的程序的数据空间.在生成子进程的过程中,exec清除了原来进程中的所有代码和数据,插入新程序的代码和数据. 3、子进程不能修改父进程的环境 子进程中环境的设置是父进程环境的复本,子进程不能修改父进程的环境,因为在进程调用fork和exec时整个环境都被自动的复制了,所以通过环境来传递数据比较方便,快捷.,9.6.3 在smsh中增加环境处理,1、存取环境变量,2、改变环境,3、对smsh的修改,从环境复制值到vartab,将值从vartab复制到新的环境,smsh4.c中的setup,void setup() extern char *environ; VLenviron2table(environ); signal(SIGINT,SIGIGN); signal(SIGQUIT,SIGIGN); ,execute2.c中的execute:,if(pid=fork()=-1) perror(“fork”); else if(pid=0) environ=VLtable2environ(); signal( SIGINT,SIGDFL); signal(SIGQUIT,SIGDFL); execvp(argv0,argv); perror(“cannot execute command”); exit(1);,在smsh中增加环境处理,9.6.4 varlib.c的代码,#include int VLenviro2table(char *env) #include . #include ”varlib.h” char * VLtable2environ() #include #define MAXVARS 200 static struct var tabMAXVARS static char *new_string(char*,char*); static struct war *find_item(char*,int); int VLstore(char *name,char *val) . char *new_string*(char *name,char *val) . char *VLlookup(char *name) . int VLexport(char *name) static struct war * find_item(char * name,int first_blank) void VLlist() ,本章中学习了Unix shell的可编程特征,在实现了的shell中增加了3个重要的功能:命令行解析,ifthen语句和变量.,9.7 已实现的shell的功能,Shell目前的特征列表,2、输入/输

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论