信创Linux操作系统管理(统信UOS版)项目七 shell编程_第1页
信创Linux操作系统管理(统信UOS版)项目七 shell编程_第2页
信创Linux操作系统管理(统信UOS版)项目七 shell编程_第3页
信创Linux操作系统管理(统信UOS版)项目七 shell编程_第4页
信创Linux操作系统管理(统信UOS版)项目七 shell编程_第5页
已阅读5页,还剩58页未读 继续免费阅读

下载本文档

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

文档简介

项目七Shell编程【项目场景】

小明负责所在公司的服务器运维工作,在工作中需要涉及服务器上的任务部署,为了避免人为因素导致误操作,并且在遇到故障时可以方便复盘,决定使用Shell脚本的方式来控制质量。【项目目标】知识目标

知道Shell是什么知道变量和环境变量知道Shell有哪些基本语句技能目标学会设置环境变量学会使用shell语句实现功能素质目标具有主动学习知识的意识具有发现问题、分析问题和解决问题的能力具有较强的团队协作能力培养精益求精、密益求密的工作态度培养认真负责、善于思考总结的工作作风主要内容任务一Shell脚本概述任务三循环语句的使用任务二条件语句的使用任务四函数的使用任务五输入输出重定向的使用任务一Shell脚本概述一、Shell概述Shell是用C语言编写的用户和Linux内核之间的接口程序,是用户与Linux的桥梁。计算机只能识别0和1的指令,我们输入的命令要被转换成代码“0”和“1”,Shell就是用来实现这种转换的。转换成功后,Linux内存用0和1代码来控制硬件。因此,Shell是和Linux内核交互的界面。同时,Shell是解释性脚本语言,支持大多数的高级语言可以见到的程序元素,如函数、变量、数组、流程结构等,其功能强大,易于编写与调试,灵活性强。在提示符界面中能输入的命令,都能放在可执行的Shell脚本程序中作为语句来使用。Shell是操作系统的最外层,可以合并编程语言来控制进程和文件,是负责User与LinuxOS之间沟通的桥梁,如图所示。它为用户提供一个操作界面,User在这个界面输入指令,其实就是通过Shell向LinuxKernel传递过去,因此Shell也叫解释器。Shell与用户、内核的关系1.管道两个或多个进程之间需要通信时,由于它们拥有自己的地址空间,因此必须有一块公共的空间,而这块空间就需要内核提供,也就是缓冲区。管道有两端,分别负责输入和输出,因此管道用于连接两个进程。进程1将数据输入缓冲区,进程2将缓冲区的数据取出来,从而实现两个进程的通信。管道的符号是“|”,其使用方法如下:$ls-l/dev|wc-l #统计系统设备目录dev下的文件和目录数量$cat/etc/passwd|grep"root:"|wc-l#统计文件/ect/passwd内包含root的行数2.tee命令tee命令输出到标准输出的同时,追加到文件file中。如果文件不存在,则创建文件;如果文件已经存在,则默认覆盖,其命令格式如下:tee[-a][files](1)-a:指定追加方式,默认采用覆盖的方式;(2)-i:用于无法中断命令(Ctrl+C)。tee命令的使用示例如下:$cal|teecalendar #将当月日历表显示到屏幕上,同时保存到calendar$ls/|teef1f23.引号机制与变量替换在Shell用三类引号:单引号(’)、双引号(”)和反单引号(`),单引号和双引号用于变量定义,反单引号用于命令替换。(1)单引号引用的字符为普通字符,特殊字符被单引号引用会失去原来的意义。$string='$PATH' 定义string变量并赋值$echo$string 显示变量值:’$PATH’(2)反向单引号的作用是命令替换。命令替换是指执行反单引号内的命令,并将执行结果返回。$

echoIam`whoami`andworkingin`pwd`输出

I

amrootand

working

in

/root(3)双引号用来定义变量,与单引号不同之处在于在双引号中间可以进行变量替换和命令替换。双引号内的特殊字符仍具有特殊意义。$myname=`whoami` #通过命令替换定义变量myname##定义变量myself。注意使用了变量替换和命令替换$myself="Iamastudent,myunameis$mynameandmyworkis`pwd`"$myself2="Iamastudent,myunameis\"$myname\"andmyworkis\"`pwd`\""echomyselfechomyself26.特殊字符Shell中除了可以使用普通键盘输入的字符,还有一些具有特殊含义和功能的特殊字符。在使用它们时,应注意其特殊的含义和作用范围。1)白空格在统信UOS系统中,空格和Tab被称为白空格(WhiteSpace),主要用于命令行中命令名、参数及选项的分隔。在特殊情况下,白空格中也可包含回车字符。2)通配符通配符是路径扩展(英文pathnameexpansion,或者是文件名扩展(filenameexpansion))功能中的模式匹配(patternmatching)功能,比如文件名配对、路径名搜索、字符串查找等。常用的通配符有“*”,“?”和括在方括号“[set]”中的字符集合。通配符的具体含义二、Shell命令1.命令格式用户登录系统后,在字符界面下可以看到一个Shell的提示符,用户可以在提示符后面输入命令和参数。例如$date$date-u在命令行中必须先输入一个命令名,后面的内容则为分隔符隔开的选项或参数。命令名[选项…][参数…]2.提示符和分隔符在统信UOS系统中,默认情况下,root用户的提示符是“#”,普通用户的提示符为“$”;分隔符为白空格。3.选项和参数参数是命令操作的对象,而选项用于影响对对象的操作行为,一般选项是由“-”字符引导的字符或字符串。在统信UOS中,选项有两种风格:一是传统的Unix风格,以“-”开始,后面跟着一个字符;另一种是GNU风格的选项,以“--”开始,后面跟着关键字或“-”跟着完整的英文单词。考虑常用习惯原因,本书介绍和使用传统的UNIX风格的选项,两种风格的选项使用如下: $date #默认方式输出时间 $date-u #传统的UNIX风格 $date--uct #GNU的风格选项 $date-universal #同上 ##显示文件/dev信息 $ls-l/dev #默认模式或者传统UNIX风格 $ls-n/dev #使用传统UNIX模式选择 $ls-l–numeric–uid-gid/dev #传统和UNIX和GUN风格混合使用 $ls-ln–time-style=ios/dev #同上4.命令行编辑特性1)命令和文件名扩展bash命令行具有命令和文件名扩展特性。当用户输入一个没有完成的命令或文件名时,只需按Tab键就能使用命令和文件名拓展特性,系统自动完成该命令的剩余输入。如果有多个命令或文件的前缀相同,bash将会显示前缀相同的文件,提供用户去查看,以方便用户输入,用户按回车键后,系统将执行这条命令。当备选文件名不唯一时,按下Tab键后,bash在补齐最大可能长度后响铃,若此时用户两次按下Esc键,bash将列出所有与输入的字符串匹配的文件名供用户选择,然后用户在输入少量可以区分文件名的字符后,再按Tab键补全命令行。2)命令行编辑bash允许用户对正在输入的命令行进行编辑。编辑时除了可使用→、←、↑、↓、Home、End、Page

UP、Page

Down、Delete

和Backspace键进行修改,还可使用命令行编辑快捷键。3)历史记录在bash中,用户按Enter键后命令行被保留在历史记录文件中,按↑或↓键在历史记录中查找,对出现的“当前记录”可以进行编辑和使用。利用这一功能可以执行以前执行过的命令,不需要重新输入该命令。在Linux系统中每条执行过的命令都保存在~/.bash_history目录下,文件内保存了1000条历史记录,每一条记录都有一个编号,用history命令列出所有历史记录。5.Shell命令执行1)命令搜索当用户从键盘输入一个命令时,Shell首先会检查是否带有路径(PATH)。如果有路径可以直接搜索它,如果找到就执行;否则就报错(提示用户命令找不到命令或命令不存在)。2)命令的返回值Linux系统默认约定,Shell命令在结束时向调用者返回一个返回值,来表示是否成功,成功为0,不成功非0,当命令是由管道连接的命令串或命令组时,最后执行的命令的返回值作为整个命令串的返回值。用户可以通过$?访问返回值。$ls/dev/sd* #执行命令,显示系统中的SCSI的设备$echo$? #显示返回值输出为0,表示/dev目录内有SCSI硬盘设备,而命令为:ls/dev/|grep‘^hd’;echo$?将输出非0(这边为1),表示系统没有IDE设备。三、Shell的变量在统信UOS下使用bash的Shell内核。Shell脚本有一套相对完善的语法规则,包括变量、数组的定义与使用、函数的构造及流程控制等。在Linux系统中,用户可以定义自己想要的变量,定义变量后变量的用法和其他语言一样可以被调用,在调用变量的时候需要用“$”作为变量名的前导符。定义变量的方法如下:var_name=var_value定义和使用方法如下:$x=18 #定义数值变量,$y='Iamastudent' #定义一个字符串y,其值为Iamastudent$echo$x$y$HOME #显示用户定义变量x,y和环境变量的HOME$z="$y,Iam$x" #由变量x和定义变量z,其值为’Iamastudent,Iam18’Shell是解释型语言,不需要定义变量类型,根据用户输入来确定变量类型。1.变量的定义Shell中的变量在使用之前不需要定义,且没有细致的分类,可以在使用的时候创建。Shell变量名由字母、数字和下划线组成,开头只能是字母或下划线。给变量赋值时,等号两边不能有空格,其格式如下:变量名=值若要给变量赋空值,可在等号后跟一个换行符,即缺省以上格式中“值”的部分;若字符串中包含空格,则必须将值放在引号(单引号或双引号)中。例如定义一个值为helloworld的变量var,可以使用以下格式:var=’helloworld’var=”helloworld”Shell中可以使用readonly将某个变量设置为只读变量,使用方法如下:readonly变量名如要将上面定义的变量var设置为只读,可以使用以下方法:readonlyvar此时若要重新为变量var赋值,则会提示var:isreadonly。在Shell脚本的函数中,在变量前添加关键字local,该变量则为局部变量。2.变量的引用Shell中使用$符号来引用变量,若要输出上文定义的变量,可以使用以下方式:echo$var在定义时,使用双引号或单引号来标注变量皆可,但是在引用时,其效果略有差异。若由双引号引起来的字符串中有变量的引用,则会输出变量中存储的值;若由单引号引起来的字符串中有变量的引用,则会原样输出。例如,在Shell脚本var中定义变量并引用:#!/bin/shvar=“HelloWorld!”echo$varecho“$var”echo‘$var’exit0执行结果如下:$shvarHelloWorld!HelloWorld!$var3.变量的输入Shell脚本中通过echo关键字打印变量,通过read关键字读取变量。当脚本需要从命令行读取数据时,只需要在其中添加如下的read语句即可:read变量名当脚本执行到该语句时,终端会等待用户输入,用户输入的信息将被保存到read之后的变量中。4.变量的分类前面提到的变量称为局部变量或本地变量,这些变量定义在脚本中,只在该脚本中生效。除此之外,Shell中还有一些独特的变量,包括环境变量、位置变量、标准变量和特殊变量。1)环境变量环境变量又称永久变量,与局部变量相对,用于创建该变量的Shell和从该Shell派生的子Shell或进程中。为了区别于局部变量,环境变量中的字母全部为大写。环境变量可以用来控制用户程序的执行,为程序编写提供环境。用户可以使用env、export或set命令来查询和修改环境变量。其用法如下:$env #显示所有的环境变量$export #同上若要将一个已存在的本地变量修改为环境变量,可以使用以下方法:export变量名若要定义一个环境变量,则使用以下格式export变量名=值常见的环境变量如下:(1)HOME:主目录,用户登入系统时所在的目录;(2)LOGNAME、USER和USERNAME:登入用户名、用户、用户名;(3)IFS:命令行内部参数、选项间的分隔符,默认为空格;(4)PATH:冒号用于分隔路径名称,shell根据PATH中的变量路径来查找命令名,查找到第一个与命令一样的可执行文件就执行它;(5)TERM:终端的类型。常用Linux和xterm;(6)PWD:当前目录的绝对路径名,取值随着cd命令跳转到不同目录而变化;(7)OLDPWD:旧的目录,即刚离开的目录。其值随着cd而变化;(8)PS1:主提示符。默认情况,超级用户的提示符是“#”,普通用户的提示符是“$”。(9)PS2:辅助提示符(继续执行提示符)。Shell在接收数据时,如果在输入行的末尾输入“\”后按回车键,或者命令没有输入完整(如引号或括号不对),则显示该提示符,提示继续输入命令,默认提示符是“>”。2)位置变量位置变量即执行脚本时传入脚本中对应脚本位置的变量。类似函数的参数,引用方法为$符号加上参数的位置,如$0、$1、$2。其中$0较为特殊,表示脚本的名称,其余的分别表示脚本中的第一个参数、第二个参数,以此类推。例如,当前有一个名为loca的脚本,其中的内容如下:#!/bin/shecho“numberofvars:”$#echo“nameofShellscript:”$0echo“firstvar:”$1echo“secondvar:”$2echo“thirdvar:”$3执行该脚本时使用的命令与输出的结果如下所示:$shlocaABCnumberofvars:3nameofShellscript:locafirstvar:Asecondvar:Bthirdvar:C3)标准变量标准变量也是环境变量,在bash环境建立时生成。该变量自动解析,通过查看etc目录下的profile文件可以查看系统中的标准环境变量。使用env命令可以查看系统中的环境变量,包括环境变量和标准变量。4)特殊变量Shell中还有一些特殊的变量,这些变量及其含义分别如下:#:传递到脚本或函数的参数数量。?:前一个命令执行情况,0表示成功,其他值表示失败。$:运行当前脚本的当前进程uid号。!:运行脚本最后一个命令。*:传递给脚本或函数的全部参数。例如,查看传递到脚本的参数数量,可以使用以下语句:echo$#这些变量的使用方法与普通变量相同。5.变量的运算Shell中的变量没有明确的类型,变量值都以字符串的形式存储,Shell中的算数运算一般通过let命令和expr命令实现。1)let命令let命令用于算术运算和数值表达式测试,其使用格式如下:let表达式假设现有一个名为let的脚本文件,其中内容如下:#!/bin/shi=1echo“i=”$ileti=i+2echo“i=”$ilet“i=i+4”echo“i=”$i该脚本的执行结果如下i=1i=3i=72)expr命令expr命令用于对整型变量进行算术计算。使用expr命令时可以使两个数值直接进行运算:$expr3+5运算结果会直接在命令行中输出。若要通过变量的引用进行运算添加$符号即可。需要注意的是在运算符与变量或数据之间需要保留一个空格,否则该命令会将命令后的内容原样输出。若要在Shell脚本中使用expr命令,需要使用符号“`”(该按键位于Tab键之上),将其内嵌到等式中。假设现在要使用一个变量接收另外两个变量的运算结果,方法如下:#!/bin/sha=10b=20value=`expr$a+$b`echo“valueis:$value”exit0执行该脚本,结果如下:valueis:30<任务实施>一、编辑脚本使用vi编辑器创建一个名为first的文件,在插入模式下,向first文件中输入以下内容并保存,退出编辑器。#!/bin/shdata="firstShe11script"#定义一个变量并初始化echo$data#输出变量dataecho"resultis:"#定义两个整型变量并初始化a=1b=2echo$(($a+$b))#输出a+b的结果exit0二、执行脚本执行脚本的方法有两种:一种是将脚本作为可执行文件;另一种方法是将脚本文件作为一个参数,通过Shell解释器对其进行解析。1.将脚本作为可执行文件若想执行该脚本程序,需要确保该文件可执行。但创建的文件一般默认没有可执行权限,因此需要使用chmod命令来提升文件的权限。$chmod+xfirst提升文件权限之后,便可以执行脚本文件了,执行该文件的方式如下所示:$./first2.将脚本作为参数具体方法如下:$shfirstfirst脚本的执行结果如下所示:firstShe11scriptresultis:3四、脚本文件内容分析(1)Shell中以#开头的行一般为注释行,类似于C语言中的//,如脚本中的第2行和第4行,但第1行是例外。第1行的#!/bin/sh是一种特殊的注释,#!后的参数表明了系统将会调用哪个程序来执行该脚本。在本例中,/bin/sh是默认的Shell程序。(2)脚本的第3行定义了一个变量data,并对该变量进行了初始化。(3)脚本第5行的echo是一个输出方法,类似于C语言中的printf()函数,用于输出数据,输出的内容为data变量的值,符号$表示对变量的引用。(4)脚本的第6行同样是echo语句。(5)脚本的第8、9两行定义了变量a和b,并对该变量进行了初始化。(6)脚本的第11行使用echo输出a和b的计算结果。(7)脚本的最后一行是exit命令,其作用是确保该脚本程序能够返回一个有意义的退出码。任务二条件语句的使用一、条件判断1.条件判断命令条件判断是条件语句的核心,Shell中通常使用test命令或[]命令对条件进行判断,判断的内容可以是变量或文件。前文提到,每个脚本程序的末尾最好加上exit命令,以便提供该脚本的返回值给其他脚本程序,而这些退出码往往应用于条件判断中。1)test命令test命令的语法格式如下:test选项参数2)[]命令[]命令与test命令的功能相同,因此以上功能也可以使用[]命令来实现。需要注意的是,[]命令与选项及参数之间应有空格。因此在[]符号中的检查条件之间需要留出空格,否则将会产生错误。2.条件判断的分类Shell中的条件判断通常可以分为三类,字符串比较、算术比较和针对文件的条件测试。二、条件语句Shell中常用的条件语句有if语句、select语句和case语句。1.if语句Shell中的if条件语句分为单分支if语句、双分支if语句和多分支if语句,其结构与其他程序设计语言的条件语句类似。(1)单分支if语句是最简单的条件语句,它对某个条件判断语句的结果进行检测,根据测试的结果选择要执行的语句。单分支if语句的格式如下:if[条件判断语句];then …fi其中关键字为:if、then和fi,fi表示该语句到此结束。(2)双分支if语句类似于C语言中的if…else…语句,其格式如下:if[条件判断语句];then …else …fi其中的关键字为:if、then、else和fi。(3)多分支if语句中可以出现不止一个的条件判断,其格式如下:if[条件判断语句];then …elif[条件判断语句];then …fi多分支if语句中的关键字为:if、then、elif、else和fi,其中elif相当于其他编程语言中的elseif。2.select语句Shell中的select语句可以将选项列表做出类似菜单的格式,以交互的形式选择列表中的数据,传入select语句中的主体部分加以执行。select语句的格式如下:select变量in列表do … [break]done其中关键字为:select、break和done。select语句实质上也是一个循环语句,若不添加break关键字,程序将无法跳出select结构。3.case语句case语句可以将一个变量的内容与多个选项进行匹配,若匹配成功,则执行该条件下对应的语句。case语句的格式如下:casevarin

选项1)…;; ‘选项2’)…;; “选项3”)…;; … *)…esac其中选项表示匹配项,用于与var值进行匹配。匹配项可以使用引号(单引号/双引号)引起来,也可以直接列出。选项后需添加)之后才是对应匹配条件下执行的内容,每个匹配条件都以“;;”结尾;最后一个匹配项*类似C语言中的default,是一个通配符,该匹配项的末尾不需要“;;”。case语句中的关键字有case和esac。esac表示case语句到此结束。<任务实施>一、判断文件是否目录1.单输出通过输出文件名,判断文件是否为目录,若是,则输出“[文件名]是个目录”#!/bin/sh#单分支if语句readfilenameif[-d$filename];then echo$filename”是个目录”fiexit0执行脚本,输入目录名test_dir,该案例的执行结果如下:test_dirtest_dir是个目录2.双输出输入文件名,判断文件是否为目录,若是,则输出“[文件名]是个目录”;否则输出“[文件名]不是目录”#!/bin/sh#双分支if语句readfilenameif[-d$filename];then echo$fielname”是个目录”else echo$filename”不是目录”fiexit0执行脚本,输入文件名test_filename,输出结果如下:test_filenametest_filename不是目录3.多输出判断一个文件是否为目录,若是,输出目录中的文件;若不是,判断该文件是否可执行。若能执行,输出“这是一个可执行文件”;否则输出“该文件不可执行”。#!/bin/shreadfilenameif[-d$filename];then ls$filenameelif[-x$filename];then echo“这是一个可执行文件”else echo“该文件不可执行”fiexit0执行脚本并输入不同内容测试脚本执行结果,输入项及输出结果分别如下。(1)输入目录~/,输出结果如下:~/DesktopDocumentsDownloadsMusicPicturesVideos(2)输入可执行文件exec_file,输出结果如下:exec_file这是一个可执行文件(3)输入不可执行的文件notexec_file,输出结果如下:notexec_file该文件不可执行二、输出目录编写脚本,脚本可输出一个包含Android、Java、C++、iOS这四个选项的菜单供选择。脚本根据用户的选择,输出对应的内容,如YouhaveselectedC++。#!/bin/sh#select条件语句echo“Whatdoyouwanttostudy?”selectsubjectin“Android”“Java”“C++”“iOS”do echo“Youhaveselected$subject.” breakdoneexit0执行该脚本,输出结果如下:Whatdoyouwanttostudy?1)Android2)Java3)C++4)iOS#?3 #选择选项3YouhaveselectedC++ #输出结果三、四则运算实现一个简单的四则运算,要求用户从键盘输入两个数据和一个运算符。脚本程序根据用户的输入,输出计算结果。#!/bin/shecho-e“a:\c”readaecho-e“b:\c”readbecho-e“select(+-*/):\c”readvarcase$varin ‘+’)echo“a+b=”`expr$a”+”$b`;; ‘-’)echo“a-b=”`expr$a”-”$b`;; ‘*’)echo“a*b=”`expr$a”*”$b`;; ‘/’)echo“a/b=”`expr$a”/”$b`;; *)echo“erroresacexit0该脚本中的echo后添加了选项-e,表示开启转义;输出内容的末尾添加了\c,表示输出内容之后不换行。执行该脚本,结果如下:a:3b:6select(+-*/):+a+b=9任务三循环语句的使用一、循环语句循环是编程语言中的重要部分,它可以将多次重复运算凝聚在简短程序中,大大减少代码量。Shell脚本中常用的循环有for循环、while循环和until循环。1.for循环for循环的格式如下:for变量in变量列表:do …done其中变量是在当前循环中使用的一个对象,用来接收变量列表中的元素;变量列表是整个循环要操作的对象的集合,可以是字符串集合或文件名、参数等,变量列表的值会被逐个赋给变量。2.while循环while循环的格式如下:while[表达式]:do …done在while循环中,当表达式的值为假时停止循环,否则循环将一直进行。此处表达式外的[]表示的是[]命令,而非语法格式中的中括号,不能省略。3.until循环until循环的格式如下:until[表达式]:do …doneuntil循环与while循环的格式基本相同,不同的是,当until循环的条件为假时,才能继续执行循环中的命令。<任务实施>一、输出月份列表使用for循环输出月份列表中的12个月份:#!/bin/shformonthinJanFebMarAprMayJunJulAugSepOctNovDecdo echo-e“$month\t\c”doneechoexit0执行该脚本,输出的结果如下:JanFebMarAprMayJunJulAugSepOctNovDec需要注意的是,变量列表中的每个变量可以使用引号单独引起来,但是不能将整个列表置于一对引号中,因为使用一对引号引起来的值会被视为一个变量。二、计算整数1~100的和使用while循环计算整数1~100的和:#!/bin/shcount=1sum=0while[$count-le100]do sum=`expr$sum+$count` count=`expr$count+1`doneecho“sum=$sum”exit0执行该脚本,输出的结果如下:sum=5050三、输出数据使用until循环输出有限个数据:#!/bin/shi=1until[$i-gt3]do echo“thenumberis$i” i=`expr$i+1`doneexit0执行该脚本,输出的结果如下:thenumberis1.thenumberis2.thenumberis3.任务四函数的使用函数将某个要实现的功能模块化,使代码结构和程序的工作流程更为清晰,也提高了程序可读性和可重用性,是程序中重要的部分。一、参数传递在C语言中,一般在函数名后的括号中使用参数列表传递函数间的数据。Shell脚本的函数中没有参数列表,而是使用位置变量获取参数,其中$0代表函数名称,$n代表传入函数的第n个参数。函数中的位置变量与脚本中的位置变量不冲突。函数中的位置变量在函数调用处传入,脚本中的位置变量在脚本执行时传入。除了常见的几种传递参数字符以外,还有一些特殊的传递参数字符,如表所示。二、函数定义Shell脚本是逐行执行的,函数需要在使用前定义。Shell中的函数相当于用户自定义的命令,函数名相当于命令名,代码段用来实现该函数的核心功能,其函数格式如下:function函数名(){

代码段 return0}(1)在Shell脚本中定义函数时,可以使用关键字function,也可以不使用;(2)函数名后的括号可以省略,若省略,则函数名与{之间需要有空格;(3)Shell脚本中的函数不带任何参数;(4)Shell脚本函数中可以使用return返回一个值,也可以不返回,若不设置返回值,则该函数返回最后一条命令的执行结果。<任务实施>一、输出“helloworld”(1)定义一个hello()函数,该函数可以输出helloworld,并在脚本中使用该函数。#!/bin/shfunctionhello(){ echo“helloworld”}helloexit0执行脚本,输出结果如下:helloworld二、显示输入结果分别为脚本中的位置变量和函数中的位置变量传递参数:#!/bin/sh#functionfunction_choice(){ echo“Yourchoiceis$1”}#maincase$1in “C++”)_choiceC++;; “Android”)_choiceAndroid;; “Python”)_choicePython;; *)echo“$0:pleaseselectin(C++/Android/Python)”esacexit0在命令行中输入shfunC++,执行该脚本,执行结果如下:$shfunC++YourchoiceisC++三、验证局部变量#!/bin/shfunctionfun(){ a=10 echo“func:a=$a”}a=5echo“main:a=$a”funecho“main:a=$a”exit0执行该脚本,输出结果如下:main:a=5fun:a=10main:a=10下面通过一个例子来展示local的用法。#!/bin/shfunctionfun(){ locala=10 echo“fun:a=$a”}a=5echo“main:a=$a”funecho“main:a=$a”exit0执行脚本,输出结果如下:main:a=5fun:a=10main:a=5根据输出结果可知,在函数调用前后,脚本中全局变量a的值一致,这说明使用关键字local定义在函数中的变量是一个局部变量。四、参数传递#!/bin/bashecho"Shell传递参数实例!";echo"执行的文件名:$0";echo"第一个参数为:$1";echo"第二个参数为:$2";echo"第三个参数为:$3";为脚本设置可执行权限,并执行脚本,输出结果如下所示:$chmod+xtest.sh$./test.sh123Shell传递参数实例!执行的文件名:./test.sh第一个参数为:1第二个参数为:2第三个参数为:3#!/bin/bashecho"Shell传递参数实例!";echo"第一个参数为:$1";echo"参数个数为:$#";echo"传递的参数作为一个字符串显示:$*";执行脚本,输出结果如下所示:$chmod+xtest.sh$./test.sh123Shell传递参数实例!第一个参数为:1参数个数为:3传递的参数作为一个字符串显示:123$*与$@都引用所有参数,二者的不同点只有在双引号中体现出来。设在脚本运行时写了三个参数1、2、3,,则"*"等价于"123"(传递了一个参数),而"@"等价于"1""2""3"(传递了三个参数)。#!/bin/bashecho"--\$*演示"foriin"$*";doecho$idone

echo"--\$@演示"foriin"$@";doecho$idone执行脚本,输出结果如下:$chmod+xtest.sh$./test.sh123--$*演示

123--$@演示

123任务五

输入输出重定向的使用一、输入/输出重定向1.标准流执行一个Shell命令时,通常会自动打开三个标准文件,即标准输入文件,文件描述符为0,通常对应终端的键盘;标准输出文件,文件描述符为1,标准错误输出文件,文件描述符为2,这两个文件都对应终端的屏幕。标准I/O流以及相关设备信息如表所示。2.输出重定向重定向一般通过在命令间插入特定的符号来实现,其语法格式如下:command1>file1该命令执行command1后将输出的内容存入file1。任何file1内已经存在的内容将被新内容替代。如果要将新内容添加在文件末尾,需要使用操作符>>。默认情况下,将stdout重定向到file的语句如下:command>file将stderr重定向到file的语句如下:$command2>file将stderr追加到file文件末尾的语句如下:$command2>>file其中,2表示标准错误文件(stderr)。将stdout和st

温馨提示

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

评论

0/150

提交评论