《Shell编程课件》由会员分享,可在线阅读,更多相关《Shell编程课件(75页珍藏版)》请在金锄头文库上搜索。
1、通信工程实训通信工程实训(五五)-Shell编程编程1Shell编程内容内容 5.1.课题引入 5.2. Shell的概念与原理 5.3. Shell环境变量的设置 5.4. Shell脚本的设计与运行2Shell编程5.1 课题引入课题引入项目分析项目分析 完成本项目需要解决的问题: 1 1、LinuxLinux中中shellshell是什么,有什么功能是什么,有什么功能 2 2、如何设定和使用、如何设定和使用ShellShell的环境变量的环境变量 3 3、如何利用、如何利用shellshell进行脚本程序的设计进行脚本程序的设计3Shell编程课题引入课题引入教学目标教学目标学习本课需要
2、实现的教学目标:掌握shell的基本命令掌握shell的基本概念和作用掌握shell环境变量概念和使用方法掌握shell程序的结构和设计方法能够完成本课程提出的项目内容4Shell编程课题引入课题引入应达到的职业能力应达到的职业能力学生学习本课后应该具有的职业能力:熟练掌握编辑器的使用深入理解shell的思想掌握shell变量和环境变量的设置能够进行基本的shell程序设计能够读懂Linux操作系统中的系统脚本5Shell编程5.2 Shell的概念与原理的概念与原理 ShellShell就是用户与操作系统内核之间的接口,起着协就是用户与操作系统内核之间的接口,起着协调用户与系统的一致性和在用
3、户与系统之间进行交调用户与系统的一致性和在用户与系统之间进行交互的作用。互的作用。 ShellShell最重要的功能是命令解释,从这种意义上来说,最重要的功能是命令解释,从这种意义上来说,ShellShell是一个命令解释器。是一个命令解释器。LinuxLinux系统中的所有可执行系统中的所有可执行文件都可以作为文件都可以作为ShellShell命令来执行。命令来执行。 将可执行文件作一个分类,如表所示将可执行文件作一个分类,如表所示6Shell编程Shell完成命令的解释过程完成命令的解释过程 当用户提交了一个命令后,当用户提交了一个命令后,ShellShell首先判断它是否为首先判断它是否
4、为内置命令,如果是就通过内置命令,如果是就通过ShellShell内部的解释器将其解内部的解释器将其解释为系统功能调用并转交给内核执行。释为系统功能调用并转交给内核执行。 若是外部命令或实用程序就试图在硬盘中查找该命若是外部命令或实用程序就试图在硬盘中查找该命令并将其调入内存,再将其解释为系统功能调用并令并将其调入内存,再将其解释为系统功能调用并转交给内核执行。转交给内核执行。 在查找该命令时分为两种情况:在查找该命令时分为两种情况: 用户给出了命令路径,用户给出了命令路径,ShellShell就沿着用户给出的路径查找,若找到则调入内就沿着用户给出的路径查找,若找到则调入内存,若没有则输出提示
5、信息存,若没有则输出提示信息 用户没有给出命令的路径,用户没有给出命令的路径,ShellShell就在环境变量就在环境变量PATHPATH所制定的路径中依次进所制定的路径中依次进行查找,若找到则调入内存,若没找到则输出提示信息行查找,若找到则调入内存,若没找到则输出提示信息7Shell编程 Shell的主要版本的主要版本 下表列出了几种常见的Shell版本 8Shell编程了解了解shell script 简单地说,shell script 就像是早期 DOS 年代的批处理(.bat),最简单的功能就是将许多命令写在一起,让使用者很轻易地就能够一下子处理复杂的操作(运行一个文件“shell s
6、cript”,就能够一次运行多个命令)。而且shell script更提供数组、循环、条件与逻辑判断等重要功能,让用户也可以直接以shell来撰写程序,而不必使用类似C程序语言等传统程序撰写的语法。9Shell编程编写与执行一个编写与执行一个shell script10Shell编程11Shell编程编写与执行一个编写与执行一个shell script12Shell编程编写与执行一个编写与执行一个shell script13Shell编程cat sh01.sh#first shellecho hello shell!14Shell编程15Shell编程养成撰写养成撰写 shell script
7、 的良好习惯的良好习惯 建议一定要养成良好的建议一定要养成良好的 script script 撰写习惯,在每个撰写习惯,在每个 script script 的文件头处包含如下内容:的文件头处包含如下内容: script script 的功能;的功能; script script 的版本信息;的版本信息; script script 的作者与联络方式;的作者与联络方式; script script 的版权声明方式;的版权声明方式; script script 的的 History History (历史记录);(历史记录); script script 内较特殊的命令,使用内较特殊的命令,使用“
8、 “绝对路径绝对路径” ”的方式来的方式来执行;执行; script script 运行时需要的环境变量预先声明与设置。运行时需要的环境变量预先声明与设置。16Shell编程5.3 Shell环境变量的设置环境变量的设置 Shell支持具有字符串值的变量。 Shell变量不需要专门的说明语句,通过赋值语句完成变量说明并予以赋值。 在命令行或Shell脚本文件中使用$name的形式引用变量name的值。 17Shell编程shell变量的定义和引用变量的定义和引用 在在ShellShell中,变量的赋值有下列句法格式:中,变量的赋值有下列句法格式: name=string name=string
9、 namename是变量名,它的值就是是变量名,它的值就是stringstring,“ “=”=”是赋值是赋值符号。变量名是以字母或下划线开头的字母、数符号。变量名是以字母或下划线开头的字母、数字和下划线字符序列。字和下划线字符序列。 通过在变量名(通过在变量名(namename)前加)前加$ $字符(如字符(如$name$name)引)引用变量的值,引用的结果就是用字符串用变量的值,引用的结果就是用字符串stringstring代替代替$name$name。 在定义变量时,若在定义变量时,若stringstring中包含空格、制表符和换中包含空格、制表符和换行符,则行符,则stringstr
10、ing必须用必须用 stringstring或者或者” ”sting”sting”的形式,即用单(双)引号将其括起来。双引号的形式,即用单(双)引号将其括起来。双引号内允许变量替换,而单引号内则不可以。内允许变量替换,而单引号内则不可以。 18Shell编程shell变量的定义和引用变量的定义和引用 19Shell编程echo20Shell编程21Shell编程22Shell编程例例例例23Shell编程例程例程echo -n “please input your first name”read firstnameecho -n “please input your last name”rea
11、d lastnameecho your name is:$firstname $lastname24Shell编程例例date 可以取得系统日期时间例如:date +”%Y-%m-%d”25Shell编程完成简单四则运算完成简单四则运算echo -n “please input first number:”read first_numecho -n “please input second number:”read second_numout1=$($first_num+$second_num)out2=$($first_num-$second_num)out3=$($first_num*$s
12、econd_num)out4=$($first_num/$second_num)echo $firstnum+$second_num=$out1echo $firstnum-$second_num=$out2echo $firstnum*$second_num=$out3echo $firstnum/$second_num=$out426Shell编程 Shell变量的作用域变量的作用域 与程序设计语言中的变量一样,Shell变量有其规定的作用范围。 Shell变量分为局部变量和全局变量: 局部变量的作用范围仅仅限制在其命令行所局部变量的作用范围仅仅限制在其命令行所在的在的ShellShell
13、或或ShellShell脚本文件中脚本文件中 全局变量的作用范围则包括本全局变量的作用范围则包括本ShellShell进程及其进程及其所有子进程所有子进程 可以使用可以使用exportexport内置命令将局部变量设置为全内置命令将局部变量设置为全局变量局变量 27Shell编程Shell变量作用域举例变量作用域举例 在当前在当前ShellShell中定义变量中定义变量var1var1 在当前在当前ShellShell中定义变量中定义变量var1var1并将设为全局并将设为全局 引用变量的值引用变量的值 显示当前显示当前ShellShell的的PID PID 28Shell编程Shell变量作
14、用域举例变量作用域举例 调用子Shell ,并显示子Shell的PID,由于var2没有被export,在子Shell中已无值,由于var2被export,所以在子Shell中仍有值 返回主Shell,并显示变量的值 29Shell编程Shell变量作用域举例(综合)变量作用域举例(综合)30Shell编程Shell变量作用域举例(综合)变量作用域举例(综合)31Shell编程Shell的环境变量的环境变量 环境变量是指由环境变量是指由ShellShell定义和赋初值的定义和赋初值的ShellShell变量。变量。 ShellShell用环境变量来确定查找路径、注册目录、终用环境变量来确定查找
15、路径、注册目录、终端类型、终端名称、用户名等。端类型、终端名称、用户名等。 所有环境变量都是全局变量,并可以由用户重新所有环境变量都是全局变量,并可以由用户重新设置。设置。 在在BashBash中,设置环境变量用中,设置环境变量用setset命令,命令的格式命令,命令的格式是:是:set set 环境变量环境变量= =变量的值变量的值32Shell编程Shell的环境变量举例的环境变量举例 设置用户的主目录为/home/john,可以用以下命令: 不加任何参数地直接使用set命令可以显示出用户当前所有环境变量的设置,如:33Shell编程Shell的环境变量举例的环境变量举例 在环境变量前面加
16、上$符号,表示引用环境变量的值,例如把目录切换到用户的主目录 : 当修改PATH变量时,如:将一个路径/tmp加到PATH变量前,应该这样设置: 34Shell编程Shell的环境变量举例的环境变量举例35Shell编程命令运行的判断依据:;、&、|(1)cmd ; cmd (不考虑命令相关性的连续命令) 在某些时候,我们希望可以一次运行多个命令,例如在关机的时候我希望可以先运行两次同步化写入磁盘后才操作重启系统 -在命令与命令中间利用分号来隔开,这样一来,分号前的命令运行完后就会立刻接着运行后面的命令。 36Shell编程命令运行的判断依据:;、&、|(2)$?(命令回传值)与“&”或“|”
17、。37Shell编程命令运行的判断依据:;、&、|38Shell编程命令运行的判断依据:;、&、|39Shell编程命令运行的判断依据:;、&、|40Shell编程命令运行的判断依据:;、&、|41Shell编程命令运行的判断依据:;、&、|【例7-4】以ls测试/tmp/bobbying是否存在,若存在则显示“exist”,若不存在,则显示“notexist”。42Shell编程命令运行的判断依据:;、&、|43Shell编程工作环境设置文件工作环境设置文件44Shell编程5.4 Shell脚本的设计与运行脚本的设计与运行 顺序脚本 分支脚本 循环脚本45Shell编程顺序脚本顺序脚本 g
18、edit t01.sh cd /dev ls 46Shell编程分支脚本分支脚本 test if fi case.esac47Shell编程循环循环 while dodone until dodone for dodone48Shell编程test命令命令 格式 test express 返回: 0(真), 1(假)49Shell编程用test判断式例程例程利用利用test命令的测试功能命令的测试功能root#geditsh05.sh#!/bin/bash#Program:#Userinputa,programwillchecktheflowing:PATH=/bin:/sbin:/usr/b
19、in:/usr/sbin:/usr/local/bin:/usr/local/sbin:/binexportPATH#让使用者输入数,并且判断使用者是否输入了read-pInputanumber:numtest-z$num&echoYouMUSTinputanum.&exit050Shell编程例程利用利用test命令的测试功能命令的测试功能#判断文件是否存在,若不存在则显示信息并结束脚本test!-e$&echoThe$DONOTexist&exit0#开始判断文件类型与属性test-f$&=regularefiletest-d$&=directorytest-r$&perm=readabl
20、etest-w$&perm=$permwritabletest-x$&perm=$permexecutable#开始输出信息echoThe:$isa$echoAndthepermissionsare:$perm51Shell编程例利用判断符号利用判断符号、&与与 |root#geditsh06.sh#!/bin/bash#Program:#Thisprogramshowstheuserschoice#History:#2012/08/25BobbyFirstreleasePATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/s
21、bin:/binexportPATHread-pPleaseinput(Y/N):yn$yn=Y-o$yn=y&echoOK,continue&exit0$yn=N-o$yn=n&echoOh,interrupt!&exit0echoIdontknowwhatyourchoiceis&exit052Shell编程使用条件使用条件if then判断式判断式1单层、简单条件判断式单层、简单条件判断式如果你只有一个判断式要进行,那么我们可以简单地这样做:if条件判断式;then当条件判断式成立时,可以进行的命令工作内容;fi=将if反过来写,就成为fi了!结束if之意!&代表AND;|代表or。53
22、Shell编程例程例程root#cpsh06.shsh06-2.sh=这样改得比较快root#geditsh07.sh#!/bin/bash#Program:#Thisprogramshowstheuserschoice#History:#2016/04/25BobbyFirstreleasePATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:/binexportPATHread-pPleaseinput(Y/N):ynif$yn=Y|$yn=y;thenechoOK,continueexit0fiif$yn=N|
23、$yn=n;thenechoOh,interrupt!exit0fiechoIdontknowwhatyourchoiceis&exit054Shell编程多重、复杂条件判断式#一个条件判断,分成功进行与失败进行(else)if条件判断式;then当条件判断式成立时,可以进行的命令工作内容;else当条件判断式不成立时,可以进行的命令工作内容;fi55Shell编程多重、复杂条件判断式如果考虑更复杂的情况,则可以使用:#多个条件判断(ifelifelifelse)分多种不同情况运行if条件判断式一;then当条件判断式一成立时,可以进行的命令工作内容;elif条件判断式二;then当条件判断式
24、二成立时,可以进行的命令工作内容;else当条件判断式一与二均不成立时,可以进行的命令工作内容;fi56Shell编程例程例程root#cpsh07.shsh08.shroot#geditsh08.sh#!/bin/bash#Program:#Thisprogramshowstheuserschoice#History:#2016/04/25BobbyFirstreleasePATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:/binexportPATHread-pPleaseinput(Y/N):ynif$yn=
25、Y|$yn=y;thenechoOK,continueelif$yn=N|$yn=n;thenechoOh,interrupt!elseechoIdontknowwhatyourchoiceisfi57Shell编程case esac case$变量名称in=关键字为case,变量前有$符第一个变量内容)=每个变量内容建议用双引号括起来,关键字则为小括号)程序段;=每个类别结尾使用两个连续的分号来处理第二个变量内容)程序段;*)=最后一个变量内容都会用*来代表所有其他值不包含第一个变量内容与第二个变量内容的其他程序运行段exit1;esac=最终的case结尾!思考一下case反过来写是什么5
26、8Shell编程例程root#geditsh09.sh#!/bin/bash#Program:#ShowHellofrom$1.byusingcase.esac#History:#2016/04/25Bobby FirstreleasePATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:/binexportPATHreadp“pleaseinput:”acase$ainhello)echoHello,howareyou?;“ok)echo“youareok!”;*)#其实就相当于通配符,0无穷多个任意字符之意ech
27、oYouMUSTinputparameters;esac59Shell编程case使用例程下面以一个例子来进一步说明:让用户能够输入one、two、three,并且将用户的变量显示到屏幕上,如果不是one、two、three时,就告诉用户仅有这三种选择。root#geditsh12.sh#!/bin/bash#Program:#Thisscriptonlyacceptstheflowingparameter:one,twoorthree.#History:#2015/04/25BobbyFirstreleasePATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/lo
28、cal/bin:/usr/local/sbin:/binexportPATHechoThisprogramwillprintyourselection!60Shell编程read-pInputyourchoice:choicecase$choiceincasechoiceinone)echoYourchoiceisONE;two)echoYourchoiceisTWO;three)echoYourchoiceisTHREE;*)echoUsage$one|two|three;esac61Shell编程使用循环(使用循环(loop) 1.whiledodone,untildodone(不定循环)
29、 2. fordodone(固定循环) 3. fordodone的数值处理62Shell编程while do done, until do done(不定循环)(不定循环)whilecondition =中括号内的状态就是判断式do=do是循环的开始!程序段落done$s66Shell编程fordodone(固定循环)(固定循环)while、until的循环方式必须要符合某个条件的状态,而for这种语法则是已经知道要进行几次循环的状态。语法如下所示:forvarincon1con2con3.do程序段done67Shell编程例程假设有三种动物,分别是假设有三种动物,分别是dog、cat、el
30、ephant,如果每一行都按,如果每一行都按“Therearedogs.”之类的样式输出,则可以如此撰写程序:之类的样式输出,则可以如此撰写程序:root#geditsh15.sh#!/bin/bash#Program:#Usingfor.looptoprint3animals#History:#2012/08/29 BobbyFirstreleasePATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:/binexportPATHforanimalindogcatelephantdoechoThereare$ani
31、mals.done68Shell编程程序如下:root#geditsh16.sh#!/bin/bash#Program#Useid,fingercommandtochecksystemaccountsinformation.#History#2012/02/18BobbyfirstreleasePATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:/binexportPATHusers=$(cut-d:-f1/etc/passwd)#获取账号名称forusernamein$users#开始循环doid$usernam
32、efinger$usernamedone69Shell编程例程: 使用循环(loop)举例来说,我想要利用ping这个可以判断网络状态的命令来进行网络状态的实际检测,要侦测的域是本机所在的192.168.1.1192.168.1.100。由于有100台主机,总不会要我在for后面输入1到100吧?此时可以这样撰写程序:root#geditsh17.sh#!/bin/bash#Program#UsepingcommandtocheckthenetworksPCstate.#History#2012/02/18BobbyfirstreleasePATH=/bin:/sbin:/usr/bin:/u
33、sr/sbin:/usr/local/bin:/usr/local/sbin:/binexportPATHnetwork=192.168.1#先定义一个网络号(网络ID)70Shell编程forsitenuin$(seq1100)#seq为sequence(连续)的缩写之意do#下面的语句取得ping的回传值是正确的还是失败的ping-c1-w1$network.$sitenu&/dev/null&result=0|result=1#开始显示结果是正确的启动(UP)还是错误的没有连通(DOWN)if$result=0;thenechoServer$network.$sitenuisUP.els
34、eechoServer$network.$sitenuisDOWN.fidone71Shell编程如果想要让用户输入某个目录名,然后找出某目录内的文件的权限,该如何做呢?程序如下:root#geditsh18.sh#!/bin/bash#Program:#Userinputdirname,Ifindthepermissionoffiles.#History:#2012/08/29BobbyFirstreleasePATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:/binexportPATH72Shell编程#先看
35、看这个目录是否存在啊read-pPleaseinputadirectory:dirif$dir=-o!-d$dir;thenechoThe$dirisNOTexistinyoursystem.exit1fi#开始测试文件=$(ls$dir)#列出所有在该目录下的文件名称forin$doperm=test-r$dir/$&perm=$permreadabletest-w$dir/$&perm=$permwritabletest-x$dir/$&perm=$permexecutableechoThefile$dir/$spermissionis$permdone73Shell编程fordodone
36、 的数值处理的数值处理除了上述的方法之外,for循环还有另外一种写法。语法如下:for(初始值;限制值;执行步长)do程序段done74Shell编程例子root#geditsh20.sh#!/bin/bash#Program:#Trydocalculate1+2+.+$your_input#History:#2015/04/25BobbyFirstreleasePATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:/binexportPATHread-pPleaseinputanumber,Iwillcountfor1+2+.+your_input:nus=0for(i=1;i$s75Shell编程