资源描述
第,7,章,Shell,编程,Shell,脚本介绍,Shell,脚本的基本语法,Shell,编程应用,Shell,脚本介绍,Shell,脚本的基本语法,点击查看本小节知识架构,Shell,编程应用,点击查看本小节知识架构,7.2,7.3,7.1,了解,掌握,掌握,掌握,学习目标,了解,Shell,脚本,1,掌握,变量,4,2,掌握,Shell,脚本的基本语法,3,掌握,Shell,脚本的编程应用,每一种计算机语言都有各自的特点与应用环境。如面向过程的C语言、面向对象的JAVA语言等。本章将重点介绍一种解释性语言Shell脚本语言。Shell脚本与Windows下的批处理相似,其工作的本质为:将各类Shell命令预先放入到一个文件中,然后批量执行,,满足,用户的各种需求。本章将主要介绍Shell脚本编程的基本语法,通过Shell编程完成实际的案例,从而提升读者的Linux,操作,系统开发能力。,7.1 Shell,脚本介绍,本书在2.2节中已经介绍了Shell的基本概念,包括Shell、Shell命令、Shell脚本三者的区别。Shell是一种使用C语言编写的命令行解释器,被用来解析用户命令,实现用户与系统的交互。Shell命令则是用户向系统内核发送的的控制请求,这个控制请求是无法被内核理解的,只是一个文本流,需要解释器进行解释。而Shell脚本则是将命令、工具、编译过的二进制程序集合在一起的文件,同时可以内建命令,提供了数组、循环、条件以及判断等重要功能。开发者可以直接以Shell的语法来写程序,而不必使用类似C语言程序等传统程序的编写语法。,7.1 Shell,脚本介绍,系统中的用户,如果,需要重复执行某一特定的任务,可以选择将任务的操作命令全部集合到Shell脚本文件中。每次执行该脚本文件,即可将这些命令批量交由Shell进行处理。Shell脚本本身,不,需,要,编译,相对于管理系统任务和其他重复工作的例程来说,具有明显的优势。,通常情况下,开发者习惯,用,“,Shell,”,代指Shell脚本,但读者需要明白,Shell与Shell脚本是两个不同的概念。,7.2 Shell,脚本的基本语法,7.2.1,脚本的开头,返回目录,7.2.2,脚本的执行,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,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,脚本的开头,保存,以上,脚本文件,然后修改文件的用户访问权限,如例所示。,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.2.2,脚本的执行,2.指定环境变量,如果用户希望在系统的任何工作目录下都可以执行某一特定目录中的Shell脚本文件,只需将Shell脚本所在的目录添加到环境变量PATH中。,将例展示的脚本文件所在的路径添加到整个环境变量中,如例所示。,7.2,Shell,脚本的基本语法,7.2.2,脚本的执行,例中,脚本文件test.sh所在的路径为“/home/linux/1000phone”。因此,使用export命令临时在PATH变量中添加该路径。完成路径添加后,即可在任意目录下直接输入文件名执行脚本文件,无,须,再指定路径。,3.作为解释器参数,除了上述的执行方式外,用户还可以选择直接运行解释器,其参数为脚本文件名,如例所示。,7.2,Shell,脚本的基本语法,按照例所示的方式执行脚本文件,其第,1,行无,须,指定解释器信息。如果需要使用的Shell为bash,则将例中的sh替换为bash即可。,7.2.3,变量,在Shell编程中,所有的变量都由字符串组成。不同于C语言程序中的变量,Shell脚本中的变量无,须,声明且没有数据类型。,Bourne Shell中有4种变量,分别为用户自定义变量、命令行参数、预定义变量、环境变量。,1.用户自定义变量,Shell脚本中的变量不支持数据类型(整型、字符型等),任何赋值给变量的值都被Shell解释为一串字符。,变量的命名需要遵循以下规则。,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的值为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函数传参类似。这些位置参数使用$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)$#:表示命令行参数的个数。,(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,操作,系统中的每一个用户都可以通过修改环境变量对自己的运行环境进行配置。,Linux操作系统中常用的环境变量如表所示,这些环境变量无,须,用户定义,并且都有其各自的含义。,7.2,Shell,脚本的基本语法,7.2.3,变量,表中的环境变量可以在命令行或Shell脚本中直接使用,设置或使用环境变量的方式如表所示。,7.2,Shell,脚本的基本语法,7.2.3,变量,根据表,所,示的环境变量以及使用方式,进行简单的测试,如例所示。,7.2,Shell,脚本的基本语法,7.2.3,变量,环境变量按照生命周期的不同可以分为永久性环境变量和临时性环境变量。根据用户等级的不同可以分为系统级环境变量和用户级环境变量。,(1)临时环境变量,临时环境变量只对当前的Shell有效,如果用户退出登录或终端关闭,则环境变量失效。如例所示。,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命令刷新配置,即可使该变量生效。,使用root用户打开配置文件,在文件的末尾添加变量,如例所示。,7.2,Shell,脚本的基本语法,7.2.3,变量,完成配置后,保存并退出文件。使用命令source刷新配置,如例所示。,7.2,Shell,脚本的基本语法,例中,执行source命令前,需确认当前的用户为root用户。切换为其他用户,测试变量是否定义成功,如例所示。,7.2.3,变量,例中,用户linux输出变量COMPANY的值,输出成功,说明该变量可以被其他用户使用。,(3)永久性环境变量(用户级),用户级的永久性环境变量只对当前用户有效。某一个用户设置此类环境变量,后,,该变量对于其他用户来说是不存在的。,设置此类环境变量需要配置用户主目录下的隐藏文件“.bashrc”。设置的方法与上一步部分中设置系统级变量时一致。,7.2,Shell,脚本的基本语法,7.2.3,变量,根据例中的输出结果可知,变量COMPANY被其他用户(,本,例中为root用户)使用时没有任何效果。,7.2,Shell,脚本的基本语法,如例所示,打开linux用户主目录下的配置文件,将例中的第32行代码添加到该文件的末尾处,保存并退出文件。使用source命令使配置文件生效。切换用户测试设置是否成功,如例所示。,7.2.4,语句,7.2,Shell,脚本的基本语法,Shell语句在一个完整的Shell程序中有着十分重要的作用。使用Shell语句不仅可以实现功能性的设计,而且可以连接控制命令。Shell语句可以分为3类:说明性语句、功能性语句、结构性语句。,1.说明性语句,说明性语句指的是注释行。注释行可以出现在Shell程序的任何位置,既可以单独一行,也可以出现在执行语句的后面。Shell程序中使用符号#注释语句,表示该语句不被解释执行。,7.2.4,语句,7.2,Shell,脚本的基本语法,例所示的第,1,行代码即为注释语句。,2.功能性语句,在Shell程序中,变量除了可以直接被赋值以外,还可以从程序外部获取值。外部获取变量的值使用键盘输入即可。,(1)键盘读取变量值,在Shell中可以使用命令read读取键盘输入的值,其格式如下。,7.2.4,语句,7.2,Shell,脚本的基本语法,使用上述格式时,从键盘输入的值将作为字符串读入“变量”中,如例所示。,例的输出结果如下所示,其中第3行为用户终端输入的内容,非程序输出。,7.2.4,语句,7.2,Shell,脚本的基本语法,用户在终端输入“1000phone”后,该字符串被读入变量COMPANY。输出变量COMPANY中的值,,,与输入时一致,说明read读取键盘输入成功。,例,是,一个Shell程序,实现查看任意目录下的文件信息。代码实现的方式为:read命令读取键盘输入的目录名并保存到自定义的变量中,然后通过ls命令引用该变量。,7.2.4,语句,7.2,Shell,脚本的基本语法,例的输出结果如下所示,其中第3行为用户终端输入的内容,非程序输出。,根据上述结果可知,键盘输入的字符串“/home/linux”被命令read读入变量DIRECTORY。通过命令ls引用变量DIRECTORY,即可查看目录“/home/linux”下的所有文件信息。,7.2.4,语句,7.2,Shell,脚本的基本语法,(2)算术运算,在Shell中,算术运算指令expr可用于实现简单的算术运算。如加(+)、减(-)、乘(*)、除(/)、,取余,(%)等操作。其表达式格式如下所示,注意符号“”为反引号,物理键位于键盘中Esc键下方。,注意:在Shell程序中,算术运算符在使用时必须搭配expr指令,单独使用没有任何效果。如例所示,,命令,expr与算术运算符一起使用,实现数值的运算。,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命令用来测试某个条件是否成立,其测试的对象主要为字符串、整数、文件属性。每种测试对象都有一套具体的测试操作符,Shell程序通过这些测试操作符,来完成具体的测试需求。,7.2.4,语句,7.2,Shell,脚本的基本语法,字符串测试操作符如表所示。,使用,表所示的测试操作符,即可完成字符串的简单测试。如例所示,从键盘输入两个字符串,测试并输出结果。,7.2.4,语句,7.2,Shell,脚本的基本语法,例,中,代码功能为判断两个字符串是否相等。其中第6行代码用来判断变量中保存的字符串是否相等,需要注意的是,“”后和“”前以及“=”两端都有空格,且不可省略。第6行代码也可以用如下语句替换,二者的功能一致。,预定义变量$?用来返回上一条命令的退出状态,正常退出为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,Shell,脚本的基本语法,由上述输出结果可知,当输入不相等的两个整数时,程序判定条件为假,输出状态值为1。表中的其,他,测试符也可以借鉴例所示的代码进行测试。,文件测试操作符如表所示。,7.2.4,语句,7.2,Shell,脚本的基本语法,使用表中的测试操作符即可完成对文件的基本测试。如例所示,测试文件是否为目录。,例的输出结果如下所示,其中第3行为用户输入内容,非程序输出。,7.2.4,语句,7.2,Shell,脚本的基本语法,由上述输出结果可知,程序检测到文件test为目录,判定条件为真,输出状态值为0。表中的其他测试,操作,符也可以借鉴例所示的代码进行测试。,3.结构性语句,Shell脚本语言中的结构性语句与其他语言类似,主要包括:条件判断语句、多路分支语句、循环语句、循环控制语句等。,(1)条件判断语句,条件判断语句的语法格式如下所示。,7.2.4,语句,7.2,Shell,脚本的基本语法,如果表达式为真,则执行命令表中的命令,否则退出if语句。上述语法格式中,if与fi必须成对使用,表示条件语句的语句括号;命令表中的命令可以是一条,也可以是若干条。,条件判断语句的使用如例所示,其功能为判断文件是否为目录。如果判断为真,则查看目录中的文件信息。,7.2.4,语句,7.2,Shell,脚本的基本语法,例,中,第4行代码的功能也可以通过test命令实现,如下所示。,例的输出结果如下所示,其中前4行为用户输入内容,非程序输出。,7.2.4,语句,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为提前创建的文件,用于测试脚本程序是否正确。上述输出结果中,可见程序检测到终端输入的文件为普通文件后,输出文件中的内容。,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.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循环语句格式中,如果命令或表达式条件为真,则执行一次命令表中的命令。执行命令表完毕后,再次判断命令或表达式是否为真,为真则继续执行命令表,如此循环,直到命令或表达式判断为假时退出循环。,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,Shell,脚本的基本语法,其输出结果如下所示。,由上述运行结果可知,程序跳过了变量等于3的一轮循环。,将例中的continue替换为break,其输出结果如下所示,可见当变量等于3时,break执行跳出整个循环。,7.2.5,函数,7.2,Shell,脚本的基本语法,在实际的程序编程中,开发者通常将具有固定功能且多次使用的一组命令(语句)封装在一个函数中,当需要使用该功能时只需调用该函数即可。在Shell中同样可以使用函数,需要注意的是,函数在调用前必须先定义。,调用程序可以传递参数给函数,函数可用return语句将运行后的结果返回给调用程序。,1.函数的定义,函数定义的方式如下所示,与C语言程序中的函数类似。,7.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中调用test2.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,编程应用,猜数字游戏是很多人在休闲聚会时都会玩的娱乐项目,其规则较为简单,即出题方随机选取一个数字后,答题方猜出该数字则挑战成功。出题方根据答题方每一轮竞猜的数字,提示答题方数字猜大了或是猜小了,直到答题方猜对为止。竞猜次数最少者为游戏赢家。,下面,通过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的任意值。将用户输入的,数字,与该,数字,进行对比即可实现猜数字的需求。例的输出结果如下。,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,操作,系统内核源代码的理解能力,适应系统开发的需求。,本章小结,
展开阅读全文