《第07章-Shell编程自考成人专科本科课件.pptx》由会员分享,可在线阅读,更多相关《第07章-Shell编程自考成人专科本科课件.pptx(78页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第7章 Shell编程Shell脚本介绍Shell脚本的基本语法Shell编程应用目录Shell脚本介绍Shell脚本的基本语法点击查看本小节知识架构Shell编程应用点击查看本小节知识架构 7.27.27.37.37.17.1了解掌握掌握掌握学习目标了解Shell脚本1 1掌握变量4 42 2掌握Shell脚本的基本语法3 3掌握Shell脚本的编程应用每一种计算机语言都有各自的特点与应用环境。如面向过程的C语言、面向对象的JAVA语言等。本章将重点介绍一种解释性语言Shell脚本语言。Shell脚本与Windows下的批处理相似,其工作的本质为:将各类Shell命令预先放入到一个文件中,然
2、后批量执行,满足用户的各种需求。本章将主要介绍Shell脚本编程的基本语法,通过Shell编程完成实际的案例,从而提升读者的Linux操作系统开发能力。7.1 Shell脚本介绍本书在2.2节中已经介绍了Shell的基本概念,包括Shell、Shell命令、Shell脚本三者的区别。Shell是一种使用C语言编写的命令行解释器,被用来解析用户命令,实现用户与系统的交互。Shell命令则是用户向系统内核发送的的控制请求,这个控制请求是无法被内核理解的,只是一个文本流,需要解释器进行解释。而Shell脚本则是将命令、工具、编译过的二进制程序集合在一起的文件,同时可以内建命令,提供了数组、循环、条件
3、以及判断等重要功能。开发者可以直接以Shell的语法来写程序,而不必使用类似C语言程序等传统程序的编写语法。7.1 Shell脚本介绍系统中的用户如果需要重复执行某一特定的任务,可以选择将任务的操作命令全部集合到Shell脚本文件中。每次执行该脚本文件,即可将这些命令批量交由Shell进行处理。Shell脚本本身不需要编译,相对于管理系统任务和其他重复工作的例程来说,具有明显的优势。通常情况下,开发者习惯用“Shell”代指Shell脚本,但读者需要明白,Shell与Shell脚本是两个不同的概念。知识架构7.2 Shell脚本的基本语法脚本的基本语法7.2.1脚本的开头返回目录7.2.2脚本
4、的执行7.2.3变量7.2.4语句知识架构7.2 Shell脚本的基本语法脚本的基本语法7.2.5函数返回目录7.2.6脚本调用7.2 Shell脚本的基本语法Shell脚本在Linux操作系统中扮演着很重要的角色。在启动Linux文件系统时,通过Shell脚本可以完成各种配置和服务的搭建,理解这些启动脚本将有助于读者分析系统的行为。学习Shell脚本也可以帮助读者对Linux内核中的Makefile有更加深入的了解,从而提升读者分析Linux内核代码结构的能力。7.2.1 脚本的开头新建Shell脚本文件,其文件扩展名为sh(sh代表Shell),扩展名本身并不影响脚本执行,如例所示。7.2
5、 Shell脚本的基本语法按照例所示的方式创建脚本文件后,使用Vim编辑器编辑Shell脚本。Shell脚本的第1行是固定的,类似于C语言程序将头文件声明作为开头,如例所示。7.2.1 脚本的开头例中,符号“#!”为约定的标记,用来通知系统该脚本文件需要使用哪种类型的解释器来执行,即使用哪一种Shell。bash(Bourne Again Shell)是Linux默认的Shell程序,是Bourne Shell 的增强版。读者也可以使用Bourne Shell(即sh),修改文件开头的标识即可,如例所示。7.2 Shell脚本的基本语法7.2.1 脚本的开头保存以上脚本文件,然后修改文件的用户
6、访问权限,如例所示。7.2 Shell脚本的基本语法修改脚本文件的权限使用命令chmod。如例所示,增加脚本文件test.sh的可执行权限。Shell脚本文件必须赋予执行权限,否则无法执行。7.2.2 脚本的执行Shell脚本文件无须编译,只需要由解释器解析。因此,修改权限后的脚本文件可直接执行。执行Shell脚本有以下3种方式。1.作为可执行程序执行例所示的脚本文件test.sh,如例所示。7.2 Shell脚本的基本语法例将脚本文件视为二进制的可执行程序,执行的方式为“./xxx.sh”。执行脚本时,Linux操作系统会根据全局环境变量PATH所指定的路径寻找该脚本,而PATH在未修改的情
7、况下,一定不会指定当前脚本文件所在的路径。因此,使用“./”表示通知系统在当前目录下寻找。7.2.2 脚本的执行2.指定环境变量如果用户希望在系统的任何工作目录下都可以执行某一特定目录中的Shell脚本文件,只需将Shell脚本所在的目录添加到环境变量PATH中。将例展示的脚本文件所在的路径添加到整个环境变量中,如例所示。7.2 Shell脚本的基本语法7.2.2 脚本的执行例中,脚本文件test.sh所在的路径为“/home/linux/1000phone”。因此,使用export命令临时在PATH变量中添加该路径。完成路径添加后,即可在任意目录下直接输入文件名执行脚本文件,无须再指定路径。
8、3.作为解释器参数除了上述的执行方式外,用户还可以选择直接运行解释器,其参数为脚本文件名,如例所示。7.2 Shell脚本的基本语法按照例所示的方式执行脚本文件,其第1行无须指定解释器信息。如果需要使用的Shell为bash,则将例中的sh替换为bash即可。7.2.3 变量在Shell编程中,所有的变量都由字符串组成。不同于C语言程序中的变量,Shell脚本中的变量无须声明且没有数据类型。Bourne Shell中有4种变量,分别为用户自定义变量、命令行参数、预定义变量、环境变量。1.用户自定义变量Shell脚本中的变量不支持数据类型(整型、字符型等),任何赋值给变量的值都被Shell解释为
9、一串字符。变量的命名需要遵循以下规则。7.2 Shell脚本的基本语法7.2.3 变量(1)只能使用字符、数字和下划线,首字符不能是数字。(2)不能出现空格,可以使用下画线。(3)不能使用Shell中已经定义的关键字。(4)通常使用全大写,便于识别。变量赋值的格式如下所示。7.2 Shell脚本的基本语法上述赋值格式中,需要注意的是,变量赋值时,等号两边不能出现空格。7.2.3 变量在Shell脚本中使用变量时,需要在变量前面加“$”符,表示引用,如例所示。7.2 Shell脚本的基本语法Shell脚本中变量的赋值,遵循从右向左的顺序,如例所示。7.2.3 变量例的运行结果如下所示,变量Y的值
10、为a,验证了赋值的顺序为从右向左。7.2 Shell脚本的基本语法Shell编程时,需要特别注意变量与其他字符混淆的问题,如例所示的代码。7.2.3 变量 例的运行结果如下。7.2 Shell脚本的基本语法例中并没有按照程序编写思维输出预想的字符串“1nd”。Shell在执行时会搜索变量NUMnd,然而脚本文件中的NUMnd是没有任何赋值的。因此,需要使用大括号来通知Shell打印的变量是NUM,如例所示。7.2.3 变量 例使用大括号选中需要输出的变量,输出结果如下。7.2 Shell脚本的基本语法 2.命令行参数Shell编程中的命令行参数(位置参数)与C程序中的main函数传参类似。这些
11、位置参数使用$N表示,N为正整数,表示命令行传入的第N个参数。N从0开始进行标记,与C语言中的数组表示的方式相同。例如,$1表示传递给脚本程序的第1个参数,并依此类推。$0表示程序本身的名字。7.2.3 变量 命令行参数的使用如例所示。7.2 Shell脚本的基本语法输出结果如下所示,执行脚本时传入命令行第1个参数10,则$1被赋值为10,再赋值给变量VAR,可见输出VAR的值为10。7.2.3 变量 3.预定义变量预定义变量即Shell已经定义的变量,用户可根据Shell的定义直接使用这些变量,无须自己定义。所有预定义的变量都由“$”和其他符号组成,常用的预定义变量如下所示。(1)$#:表示
12、命令行参数的个数。(2)$:包含所有的命令行参数,即“$1、$2、$3.”。(3)$?:前一个命令的退出状态,正常退出返回0,反之为非0值。(4)$*:包含所有的命令行参数,即“$1、$2、$3.”。(5)$:正在执行的进程的ID号。7.2 Shell脚本的基本语法7.2.3 变量预定义变量的使用如例所示。7.2 Shell脚本的基本语法输出结果如下所示,在命令行输入参数。由输出结果可知,$0为“./test.sh”,$#为命令参数的个数,共有5个参数,$*表示命令行所有的参数。7.2.3 变量4.环境变量环境变量是操作系统中具有特定名字的对象,Linux操作系统中的每一个用户都可以通过修改环
13、境变量对自己的运行环境进行配置。Linux操作系统中常用的环境变量如表所示,这些环境变量无须用户定义,并且都有其各自的含义。7.2 Shell脚本的基本语法7.2.3 变量表中的环境变量可以在命令行或Shell脚本中直接使用,设置或使用环境变量的方式如表所示。7.2 Shell脚本的基本语法7.2.3 变量根据表所示的环境变量以及使用方式,进行简单的测试,如例所示。7.2 Shell脚本的基本语法7.2.3 变量环境变量按照生命周期的不同可以分为永久性环境变量和临时性环境变量。根据用户等级的不同可以分为系统级环境变量和用户级环境变量。(1)临时环境变量临时环境变量只对当前的Shell有效,如果
14、用户退出登录或终端关闭,则环境变量失效。如例所示。7.2 Shell脚本的基本语法7.2.3 变量例中,使用命令export导出新的自定义的变量VAR并赋值,使用echo输出变量VAR的值。变量VAR只在当前Shell中有效,如果关闭该终端或退出用户linux,则VAR将失效。重启终端,再次输出变量VAR的值,如下所示。7.2 Shell脚本的基本语法输出为空,说明变量VAR已经失效。7.2.3 变量(2)永久性环境变量(系统级)系统级的永久性环境变量对系统内所有的用户生效,其作用范围为整个系统。用户在系统配置文件“/etc/profile”中添加需要的环境变量后,使用source命令刷新配置
15、,即可使该变量生效。使用root用户打开配置文件,在文件的末尾添加变量,如例所示。7.2 Shell脚本的基本语法7.2.3 变量完成配置后,保存并退出文件。使用命令source刷新配置,如例所示。7.2 Shell脚本的基本语法例中,执行source命令前,需确认当前的用户为root用户。切换为其他用户,测试变量是否定义成功,如例所示。7.2.3 变量例中,用户linux输出变量COMPANY的值,输出成功,说明该变量可以被其他用户使用。(3)永久性环境变量(用户级)用户级的永久性环境变量只对当前用户有效。某一个用户设置此类环境变量后,该变量对于其他用户来说是不存在的。设置此类环境变量需要配
16、置用户主目录下的隐藏文件“.bashrc”。设置的方法与上一步部分中设置系统级变量时一致。7.2 Shell脚本的基本语法7.2.3 变量根据例中的输出结果可知,变量COMPANY被其他用户(本例中为root用户)使用时没有任何效果。7.2 Shell脚本的基本语法如例所示,打开linux用户主目录下的配置文件,将例中的第32行代码添加到该文件的末尾处,保存并退出文件。使用source命令使配置文件生效。切换用户测试设置是否成功,如例所示。7.2.4 语句7.2 Shell脚本的基本语法Shell语句在一个完整的Shell程序中有着十分重要的作用。使用Shell语句不仅可以实现功能性的设计,而
17、且可以连接控制命令。Shell语句可以分为3类:说明性语句、功能性语句、结构性语句。1.说明性语句说明性语句指的是注释行。注释行可以出现在Shell程序的任何位置,既可以单独一行,也可以出现在执行语句的后面。Shell程序中使用符号#注释语句,表示该语句不被解释执行。7.2.4 语句7.2 Shell脚本的基本语法例所示的第1行代码即为注释语句。2.功能性语句在Shell程序中,变量除了可以直接被赋值以外,还可以从程序外部获取值。外部获取变量的值使用键盘输入即可。(1)键盘读取变量值在Shell中可以使用命令read读取键盘输入的值,其格式如下。7.2.4 语句7.2 Shell脚本的基本语法
18、使用上述格式时,从键盘输入的值将作为字符串读入“变量”中,如例所示。例的输出结果如下所示,其中第3行为用户终端输入的内容,非程序输出。7.2.4 语句7.2 Shell脚本的基本语法用户在终端输入“1000phone”后,该字符串被读入变量COMPANY。输出变量COMPANY中的值,与输入时一致,说明read读取键盘输入成功。例是一个Shell程序,实现查看任意目录下的文件信息。代码实现的方式为:read命令读取键盘输入的目录名并保存到自定义的变量中,然后通过ls命令引用该变量。7.2.4 语句7.2 Shell脚本的基本语法例的输出结果如下所示,其中第3行为用户终端输入的内容,非程序输出。
19、根据上述结果可知,键盘输入的字符串“/home/linux”被命令read读入变量DIRECTORY。通过命令ls引用变量DIRECTORY,即可查看目录“/home/linux”下的所有文件信息。7.2.4 语句7.2 Shell脚本的基本语法(2)算术运算在Shell中,算术运算指令expr可用于实现简单的算术运算。如加(+)、减(-)、乘(*)、除(/)、取余(%)等操作。其表达式格式如下所示,注意符号“”为反引号,物理键位于键盘中Esc键下方。注意:在Shell程序中,算术运算符在使用时必须搭配expr指令,单独使用没有任何效果。如例所示,命令expr与算术运算符一起使用,实现数值的运
20、算。7.2.4 语句7.2 Shell脚本的基本语法7.2.4 语句7.2 Shell脚本的基本语法例通过命令read读取键盘输入的值并保存到变量VAR1、VAR2中;通过expr命令使用算术运算符实现加、减、乘、除、取余,并输出运算后的值。需要特别注意的是,expr命令在配合算术运算符使用时,运算符两边必须有空格。例运行结果如下所示,其中第3行和第4行为用户输入设置,非程序输出。7.2.4 语句7.2 Shell脚本的基本语法expr命令除了可以实现上述功能以外,还可以实现数值或字符串比较、字符串匹配、字符串提取、字符串长度计算、判断变量或参数等功能。(3)test命令Shell中的test
21、命令用来测试某个条件是否成立,其测试的对象主要为字符串、整数、文件属性。每种测试对象都有一套具体的测试操作符,Shell程序通过这些测试操作符,来完成具体的测试需求。7.2.4 语句7.2 Shell脚本的基本语法字符串测试操作符如表所示。使用表所示的测试操作符,即可完成字符串的简单测试。如例所示,从键盘输入两个字符串,测试并输出结果。7.2.4 语句7.2 Shell脚本的基本语法例中代码功能为判断两个字符串是否相等。其中第6行代码用来判断变量中保存的字符串是否相等,需要注意的是,“”后和“”前以及“=”两端都有空格,且不可省略。第6行代码也可以用如下语句替换,二者的功能一致。预定义变量$?
22、用来返回上一条命令的退出状态,正常退出为0,其它情况为1。7.2.4 语句7.2 Shell脚本的基本语法例的测试结果如下所示,其中第2行和第3行为用户输入内容,非程序输出结果。如上所示,当输入两个不同字符串时,程序返回状态值1,表示两个字符串不相等。读者也可以使用同样的方式,练习使用表中的其它测试操作符。7.2.4 语句7.2 Shell脚本的基本语法整数测试操作符如表所示。7.2.4 语句7.2 Shell脚本的基本语法使用表中的测试操作符即可实现整数的测试。如例所示,判断两个整数是否相等。例的输出结果如下所示,其中第2行和第3行为用户终端输入的内容,非程序输出。7.2.4 语句7.2 S
23、hell脚本的基本语法由上述输出结果可知,当输入不相等的两个整数时,程序判定条件为假,输出状态值为1。表中的其他测试符也可以借鉴例所示的代码进行测试。文件测试操作符如表所示。7.2.4 语句7.2 Shell脚本的基本语法使用表中的测试操作符即可完成对文件的基本测试。如例所示,测试文件是否为目录。例的输出结果如下所示,其中第3行为用户输入内容,非程序输出。7.2.4 语句7.2 Shell脚本的基本语法由上述输出结果可知,程序检测到文件test为目录,判定条件为真,输出状态值为0。表中的其他测试操作符也可以借鉴例所示的代码进行测试。3.结构性语句Shell脚本语言中的结构性语句与其他语言类似,
24、主要包括:条件判断语句、多路分支语句、循环语句、循环控制语句等。(1)条件判断语句条件判断语句的语法格式如下所示。7.2.4 语句7.2 Shell脚本的基本语法如果表达式为真,则执行命令表中的命令,否则退出if语句。上述语法格式中,if与fi必须成对使用,表示条件语句的语句括号;命令表中的命令可以是一条,也可以是若干条。条件判断语句的使用如例所示,其功能为判断文件是否为目录。如果判断为真,则查看目录中的文件信息。7.2.4 语句7.2 Shell脚本的基本语法例中第4行代码的功能也可以通过test命令实现,如下所示。例的输出结果如下所示,其中前4行为用户输入内容,非程序输出。7.2.4 语句
25、7.2 Shell脚本的基本语法在C语言编程中,if通常与else配对使用,这种使用方式在Shell中也同样适用。具体的语法格式如下。如果表达式为真,则执行命令表1中的命令,否则执行命令表2 中的命令。使用上述语法格式对例所示的代码进行补充。如例所示,如果判断文件是目录,则查看目录下所有的文件(隐藏文件除外);如果判断文件为普通文件,则查看文件中的内容。7.2.4 语句7.2 Shell脚本的基本语法例中第711行代码,可以简化为如下代码,其功能一致。7.2.4 语句7.2 Shell脚本的基本语法例的输出结果如下所示,其中第1行第3行和4行为用户输入内容,非程序输出。文件test.txt为提
26、前创建的文件,用于测试脚本程序是否正确。上述输出结果中,可见程序检测到终端输入的文件为普通文件后,输出文件中的内容。7.2.4 语句7.2 Shell脚本的基本语法(2)多路分支语句多路分支语句即多重条件测试,类似于C语言程序中的switch-case语句。其语法格式如下。7.2.4 语句7.2 Shell脚本的基本语法上述语法格式的具体使用如例所示。7.2.4 语句7.2 Shell脚本的基本语法例中,代码的功能为引导用户输入,仅起提示作用。根据用户输入的请求,执行不同的提示,程序输出结果如下所示。由上述输出结果可见,运行脚本程序时,输入不同的请求,则程序输出不同的提示。7.2.4 语句7.
27、2 Shell脚本的基本语法(3)for循环语句for循环语句一般用于循环次数确定的情况下,多次执行一条命令或一组命令。其格式如下所示。上述语法格式的使用如例所示,计算1100的和。7.2.4 语句7.2 Shell脚本的基本语法例中,seq命令用于生成一个数到另一个数之间的所有整数。输出结果如下所示。(4)while循环语句while循环语句与C语言中的while循环语句类似,其语法格式如下。7.2.4 语句7.2 Shell脚本的基本语法上述while循环语句格式中,如果命令或表达式条件为真,则执行一次命令表中的命令。执行命令表完毕后,再次判断命令或表达式是否为真,为真则继续执行命令表,如
28、此循环,直到命令或表达式判断为假时退出循环。while循环的具体使用如例所示,其功能与例相同,计算1100的和。7.2.4 语句7.2 Shell脚本的基本语法例的运行结果如下所示。(5)循环控制语句循环控制语句包括break语句与continue语句。break语句表示跳出整个循环,而continue语句只是跳出本轮循环,进入下一轮循环。7.2.4 语句7.2 Shell脚本的基本语法continue语句的使用如例所示。例所示代码的功能为:通过for循环依次输出16所有的整数。其中第58行代码为判断条件,即变量等于3时,使用continue语句跳过输出变量值的操作。7.2.4 语句7.2 S
29、hell脚本的基本语法其输出结果如下所示。由上述运行结果可知,程序跳过了变量等于3的一轮循环。将例中的continue替换为break,其输出结果如下所示,可见当变量等于3时,break执行跳出整个循环。7.2.5 函数7.2 Shell脚本的基本语法在实际的程序编程中,开发者通常将具有固定功能且多次使用的一组命令(语句)封装在一个函数中,当需要使用该功能时只需调用该函数即可。在Shell中同样可以使用函数,需要注意的是,函数在调用前必须先定义。调用程序可以传递参数给函数,函数可用return语句将运行后的结果返回给调用程序。1.函数的定义函数定义的方式如下所示,与C语言程序中的函数类似。7.
30、2.5 函数7.2 Shell脚本的基本语法函数也可以定义为如下格式。2.函数调用格式函数调用的格式如下所示,函数的所有的标准输出都传递给了主程序的变量。7.2.5 函数7.2 Shell脚本的基本语法除上述格式所示的调用方式外,函数也可以被直接调用,其格式如下。3.函数使用编写一个示例,其功能为:求两个数的和(这两个数使用位置参数传参),并输出结果。7.2.5 函数7.2 Shell脚本的基本语法如例所示,将求和功能封装为一个函数。例的执行结果如下。7.2.6 脚本调用7.2 Shell脚本的基本语法在Shell脚本程序中,可以调用另一个Shell脚本。如例所示,在test1.sh中调用te
31、st2.sh。test2.sh脚本的代码如例所示。7.2.6 脚本调用7.2 Shell脚本的基本语法运行例所示的脚本程序test1.sh,其结果如下。根据输出结果可知,test1.sh成功调用test2.sh脚本程序。知识架构7.3 Shell编程应用编程应用7.3.1猜数字游戏返回目录7.3.2石头、剪刀、布游戏7.3.1 猜数字游戏7.3 Shell编程应用猜数字游戏是很多人在休闲聚会时都会玩的娱乐项目,其规则较为简单,即出题方随机选取一个数字后,答题方猜出该数字则挑战成功。出题方根据答题方每一轮竞猜的数字,提示答题方数字猜大了或是猜小了,直到答题方猜对为止。竞猜次数最少者为游戏赢家。下
32、面通过Shell编程完成猜数字游戏,其工作的方式为:运行脚本程序后将随机产生一个数字,程序根据用户输入,提示用户猜对、猜大或者猜小,直到用户猜对,脚本结束。通过Shell编程实现猜数字游戏的代码如例所示。本例使用的Shell为Bourne Again Shell(bash),因为Bourne Shell(即sh)不支持RANDOM系统变量。7.3.1 猜数字游戏7.3 Shell编程应用7.3.1 猜数字游戏7.3 Shell编程应用根据上述输出结果可知,本次猜数字通过6次竞猜得到正确答案。例中,系统变量RANDOM随机生成一个数字后,采用取余的方式,得到0100的任意值。将用户输入的数字与该
33、数字进行对比即可实现猜数字的需求。例的输出结果如下。7.3.2 石头、剪刀、布游戏7.3 Shell编程应用石头、剪刀、布游戏是一种流行多年的猜拳游戏。游戏利用循环相克的特性,实现了相互制约,即石头克剪刀,剪刀克布,布克石头。因此,这种游戏经常被用来解决争议,快速实现胜负。下面通过Shell编程实现人机交互的石头、剪刀、布游戏。示例代码参考教材7.3.2节。例将石头、剪刀、布这3个元素保存在数组中,然后通过随机获取数组的下标得到系统的出拳,最后通过逻辑判断得到玩家本轮的游戏结果。7.3.2 石头、剪刀、布游戏7.3 Shell编程应用其运行结果如下所示。上述运行结果中,玩家选择3,表示出布。系统显示玩家赢,说明程序随机选择的是石头,即随机的下标为0。本章主要介绍的是Shell脚本的编写,其核心内容为Shell脚本的基本语法。需要读者特别关注的是Shell语句。相较于C语言程序,Shell语句的语法格式更加统一且严格。读者在编写Shell程序时,需要特别注意语句中的空格、符号、缩进等问题。最后,本章以生活中的小游戏作为设计需求,通过Shell编程实现这些功能,其目的在于帮助读者更好地掌握Shell脚本的基本语法。熟练Shell编程,有助于读者提升对Linux操作系统内核源代码的理解能力,适应系统开发的需求。本章小结