Linux操作系统--第7次 shell编程_第1页
Linux操作系统--第7次 shell编程_第2页
Linux操作系统--第7次 shell编程_第3页
Linux操作系统--第7次 shell编程_第4页
Linux操作系统--第7次 shell编程_第5页
已阅读5页,还剩75页未读 继续免费阅读

下载本文档

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

文档简介

.,shell编程,.,1认识shell及shell脚本,shell命令解释器,其主要功能是负责解释和执行命令行上键入的内容。shell也提供了完善的编程能力。流行的shell有多种,如Bash、Tcsh、Ksh等。,.,1认识shell及shell脚本,shell作用示意图,.,1认识shell及shell脚本,Shell类型/bin/sh(最早的shell程序,已经被/bin/bash所取代);/bin/bash(通常情况下Linux系统默认的shell);/bin/ksh(贝尔实验室开发,兼容于bash);/bin/zsh(基于ksh开发,功能更加强大);/bin/csh(语法和C语言相似,更多的考虑了用户界面的友好性);/bin/tcsh(csh的增强版,取代csh,提供更多的功能);,.,1认识shell及shell脚本,Bash的重要功能命令和文件补全命令历史记录功能命令别名设置功能通配符功能作业控制、前后台控制,.,1认识shell及shell脚本,shellscript就像是早期批处理文件,最简单的功能就是将多条指令汇整写在一起,只需执行一次就可以轻松处理复杂的动作rootserverroot#vie1.sh内容如下:#!/bin/bashlsecho“Hello,world!”说明:shell脚本是按行解释的,每个脚本的第一行总是以#!/bin/bash开头在shell脚本中,以“#”开头的行表示注释shell将忽略对该行的处理,即不进行解释、显示和执行,.,认识shell及shell脚本,有两种执行shell脚本程序的方法。直接执行1给脚本e1.sh增加执行权rootserverroot#chmoda+xe1.sh2键入./el.sh直接执行脚本rootserverroot#./e1.she1.shHello,world!键入sh脚本名rootserverroot#she1.shHello,world!,.,环境变量,环境变量在用户登录时,Linux系统会自动设置一些变量,这些变量的值决定了用户的工作环境和外观,因此称为环境变量。可用“env”(environment)列出所有的环境变量及内容,.,环境变量,常用环境变量HOSTNAME:代表主机名称;SHELL:当前环境下使用的shell程序,如果是bash的话,默认是/bin/bash;HISTSIZE:记录曾经执行过的历史命令条数;USER:用户的名称;ENV:用户所用的个性化环境设置文件的读取文件;HOME:代表用户的家目录,很多程序都可能会用到这个变量的值;MAIL:当使用mail命令收信时,系统会去读取的邮件信箱文件;PATH:执行文件搜索的路径。目录之间以冒号(:)分割,顺序很重要,决定查询顺序;PWD:当前工作目录;SHLVL环境变量:SHELL的层数。显示环境变量#echo$变量名,.,环境变量,可写的shell环境变量可以对它们进行赋值,大部分可写的shell变量都在登录过程执行/etc/profile文件时初始化用户也可以修改自己的启动文件用户目录/.bash_profile来定制自己的运行环境环境变量一般是大写的,系统启动后自动加载,可写的环境变量用户也可以随时进行修改#rootlocalhost#echo$PS1uhW$rootlocalhost#PS1=uh*rootlocalhost*,.,环境变量,设置环境变量用户定义的普通变量通过导出也可以成为环境变量。环境变量就可以被其他的程序或下级子shell所访问。设置的命令是export,其格式如下:export变量名rootserver#exportMYVAR=hellorootserver#echo$MYVARhello,.,本地用户变量,本地变量一般地,shell变量不需要先定义,就可以直接为其赋值,即在赋值的同时完成变量的定义。为变量赋值的格式如下:变量名=变量值rootserverroot#a=1注意:在等号的左右两边不能出现空格。,.,本地用户变量,当赋值的内容包含空格时,要使用“”将内容括起来,否则只将空格前面的内容赋值给该变量jackybogon$tom=”jackysfather”jackybogon$echo$tomjackysfather,.,本地用户变量,双引号中出现其它变量名时,在显示内容时会将该变量的内容显示出来,而单引号则只是原封不动的显示字符,即一些特殊字符失去意义。例如jackybogon$name=jackyjackybogon$test1=$namesevenjackybogon$echo$test1$namesevenjackybogon$test2=”$nameseven”jackybogon$echo$test2jackyseven,.,本地用户变量,反引号括起来的字符串被shell解释为命令行jackybogon$mydate=”mytimeis:date”jackybogon$echo$mydatemytimeis:2012年3月15日星期四13:20:23CST可使用declare指令来声明变量并设置变量的属性rootlocalhost桌面#declarea=10rootlocalhost桌面#echo$a,.,本地用户变量,使用变量值在变量名前加上前缀“$”符号,$variableecho$mydate大括号在不引起歧义的情况下也可以省略,以下例子表示使用变量时的不同情况jackybogon$name=jackyjackybogon$echo$nameseven注:带有大括号相当于拼合字符串jackysevenjackybogon$echo$nameseven注:$name和seven间无空格,表空串jackybogon$echo$nameseven注:$name和seven间有空格jackyseven,.,本地用户变量,清除变量使用“unset”命令将其清除jackybogon$tom=”jackysfather”jackybogon$echo$tomjackysfatherjackybogon$unsettomjackybogon$echo$tom,.,特殊变量,特殊变量:位置变量和特定变量参数如果要向一个shell脚本传递信息,可以使用位置参数来完成。$0表示命令或shell脚本,无论脚本是否有参数,此值均可用。$1-$9表示位置参数。如果参数个数多于9个,则多出的参数将会被忽略。jackybogon$autobak.sh/etc/home/jacky/usr/boot/opt/lib,.,特殊变量-位置参数,请看以下位置参数示例:rootservermyshell#vie2.sh内容如下:#!/bin/bashecho$1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11rootservermyshell#./e2.shabcdefghijka,b,c,d,e,f,g,h,i,a0,a1,.,特殊变量-位置参数,通过shift命令可以实现位置参数的左移,其格式如下:shift前移量位置参数移位示例:rootservermyshell#cate3.sh#!/bin/shshiftecho$1shift2echo$1rootservermyshell#./e3.shabcdbd,.,特殊变量,特定变量参数表示的相关控制信息。,.,打印特殊变量,rootservermyshell#vispecialvar.sh#!/bin/bashecho$#is:$#echo$*is:$*echo$?is:$?echo$is:$echo$0is:$0,.,元字符,元字符:具有特殊的含义与作用,无法像普通字符那样使用它们,如果想把它们用作普通字符(比如说在echo语句中)就需要用一个反斜杠对它们进行转换,当然也可以使用单引号“”将元字符或者含有元字符的变量字符串括起来,同样可以达到相同的目的。,.,变量操作,read命令:用来从键盘或文件的某一行文本中读入信息,并将其赋给一个变量。一般形式:readvarible1varible2.jackybogon$readtestthisisatestjackybogon$echo$testthisisatestjackybogon$readtest1test2#输入内容第一个空格之后的内容全部赋予最后一个变量thisisatestjackybogon$echo$test2isatest,.,变量操作,.,变量操作,expr:该命令一般用于整数值,也可用于字符串。格式:exprargumentoperatorargumentjackybogon$expr3+5#运算符两侧无空格原样输出3+5jackybogon$expr3+5#任何一侧无空格均会被认为是语法错误8jackybogon$var=8jackybogon$expr$var5#可以使用变量参与运算3jackybogon$expr$var*8#使用“”在“*”前避免认为其是通配符64,.,学习ShellScript,shell脚本实质上就是一个文本文件,内容是多条命令和变量通过控制语句结合在一起来完成特定的功能,因此编辑shell脚本可以通过vim来实现。如使用脚本实现环境变量PATH的设置,在屏幕上显示“Ourfirstshellscriptn”提示字符串#vie4.sh#!/bin/bash#firstshellprogramPATH=/bin:/sbin:/usr/sbin:/sur/local/bin:/usr/local/sbin:.exportPATHechoe“Ourfirstshellscriptn”exit0,.,学习ShellScript,通常编写一个shell命令脚本程序需要经过以下几个基本步骤:1)打开vim等文本编辑器,准备输入脚本内容;2)添加shell定义语句,使linux操作系统知道用户使用哪一种shell语言;3)编写shell命令脚本程序;4)保存命令脚本程序并退出;5)使用“chmodu+x”命令来修改这个脚本文件的权限使它可以执行;6)终端提示符后输入“./脚本名称”(或使用“sh脚本名称”)来执行该脚本;7)如执行错误进行必要调试,转步骤4)执行。,.,条件判断式,shell中提供了test命令来实现上述的条件测试功能。在shell脚本中条件测试既可以用在分支结构中,又可以用在循环结构中。,.,条件判断式,test命令(1)test命令有两种使用格式:第一种是在test语句后加上测试条件;第二种是用方括号代替test。(2)test命令的格式如下:test测试条件或测试条件,.,条件判断式-文件测试,文件测试条件示例:rootservermyshell#testfe2.shrootservermyshell#echo$?0功能:测试文件e2.sh是否为普通文件,测试结果为e2.sh是普通文件。rootservermyshell#-fe60.shrootservermyshell#echo$?1,.,条件判断式-文件测试,要求:测试文件le2.sh是否为符号连接文件rootservermyshell#ln-se2.shle2.shrootservermyshell#-Lle2.shrootservermyshell#echo$?0要求:测试文件/dev/hda1是否是块设备文件。rootservermyshell#-b/dev/hda1rootservermyshell#echo$?0,.,条件判断式-字符串测试,string1=string2功能:字符串string1和字符串string2相等string1!=string2功能:字符串string1和字符串string2不相等-nstring1功能:字符串string1非空-zstring1功能:字符串string1为空,.,条件判断式-字符串测试,字符串测试示例:rootserverroot#echo$LOGNAMErootrootserverroot#$LOGNAME=“root”rootserverroot#echo$?0,.,条件判断式-数值测试,expr1eqexpr2功能:当表达式expr1的值与表达式expr2的值相等expr1neexpr2功能:当表达式expr1的值与表达式expr2的值不相等expr1gtexpr2功能:当表达式expr1的值大于与表达式expr2的值expr1ltexpr2功能:当表达式expr1的值小于与表达式expr2的值expr1geexpr2功能:当表达式expr1的值大于等于表达式expr2的值expr1leexpr2功能:当表达式expr1的值小于等于表达式expr2的值,.,条件判断式-数值测试,rootserverroot#a=10rootserverroot#b=20rootserverroot#declare-icrootserverroot#c=$a+$brootserverroot#echo$c30,.,条件判断式-数值测试,rootserverroot#$c-eq30rootserverroot#echo$?0rootserverroot#$c-eq30rootserverroot#echo$?0rootserverroot#$c-ne30rootserverroot#echo$?1rootserverroot#$c-ge35rootserverroot#echo$?1,.,条件判断式-逻辑操作符,shell提供的逻辑操作符有三个:一是逻辑与、二是逻辑或、三是逻辑非。,.,条件判断式-与或非,逻辑与操作符示例:rootserverroot#name=Tomrootserverroot#password=abcrootserverroot#$name=“Tom”a$password=“abc”rootserverroot#echo$?0功能:测试变量$name是否等于“Tom”并且$password是否等于“abc”。,.,条件判断式-与或非,示例:rootserverroot#lsle3.sh-rw-r-r-1rootroot41Jan1412:16e3.shrootserverroot#-re3.sh-a-xe3.shrootserverroot#lecho$?1功能:测试文件e3.sh是否同时具有读权限和可执行权限。,.,条件判断式-与或非,rootserverroot#name=Tomrootserverroot#password=abcrootserverroot#$name=“Tom”-o$password=“123456”rootserverroot#echo$?0,.,条件判断式-与或非,逻辑非操作符示例:rootserverroot#lsle3.sh-rw-r-r-1rootroot41Jan1412:16e3.shrootserverroot#-xe3.shrootserverroot#echo$?1rootserverroot#!xe3.shrootserverroot#echo$?0需要注意的是,逻辑非“!”的两边也必须各有一个空格。,.,分支控制结构,在shell中有两种形式的分支结构:一种是if分支结构,另一种case分支结构。,.,分支控制结构,if分支结构的基本格式如下:if条件测试1;then条件测试1为真时的语句序列elif条件测试2;then条件测试2为真时的语句序列.else条件测试为假时的语句序列fi,.,分支控制结构,if分支结构示例一:用户输入字符串,判断其内容是否与存储在变量$name中的内容相同。rootserverroot#cate10.sh#!/bin/shname=garfieldecho-nPleaseinput:readuservalueif$uservalue=$name;thenechosameelseechodifferencefi,.,分支控制结构,执行:rootserverroot#./e10.shPleaseinput:abcdifferencerootserverroot#./e10.shPleaseinput:garfieldsame,.,分支控制结构,if分支结构示例二:判断今天是不是星期一。rootserverroot#cate12.sh#!/bin/shtoday=date+%uif$today=1;thenechoTodayisMondayelseechoTodayisnotMondayfi,.,分支控制结构,执行:rootserverroot#dateSunJan1417:12:25CST2007rootserverroot#./e12.shTodayisnotMonday,.,分支控制结构,if分支结构示例三:判断用户指定文件的类型。rootserverroot#cate13.sh#!/bin/shusefile=$1if-d$usefile;thenechodirectoryelif-f$usefile;thenechonormalelif-b$usefile;thenechoblockdeviceelif-c$usefile;thenechochardeviceelseechootherfi,.,分支控制结构,执行:rootserverroot#./e13.she13.shnormal,.,分支控制结构,case语句的结构如下:case值in模式1)语句组1;模式2)语句组2;*)语句组nesac,.,分支控制结构,case分支结构示例一:通过判断$1的值,设置用户指定文件的权限。rootserverroot#cate16.sh#!/bin/bashoption=$1filename=$2case$optioninr)chmodu+r$filename;w)chmodu+w$filename;x)chmodu+x$filename;*)echoerror!exit1;esacexit0,.,分支控制结构,rootserverroot#ls-labc-rw-r-r-1rootroot161Jan1321:36abcrootserverroot#./e16.shxabcrootserverroot#ls-labc-rwxr-r-1rootroot161Jan1321:36abc,.,分支控制结构,case分支结构示例二:提示键入“y”或“n”,根据实际输入执行相应分支。#!/bin/shecho-nPleaseinputyourchoicey|n:readchcase$chiny|Y|yes|YES)echogoon;n|N|no|NO)echocancel;*)echoerror,youshouldinputy|nexit1;esacexit0,.,分支控制结构,执行:rootserverroot#./e17.shPleaseinputyourchoicey|n:ygoon,.,循环结构,1for循环其典型格式如下:for变量in值1值2值ndo语句1语句2done,.,循环结构,for循环示例一:显示全部位置变量参数。rootserverroot#cate19.sh#!/bin/bashforiin$doecho$idonerootserverroot#./e19.shabcdeabcde说明:如果省略了in,则默认从$*或$中取值。,.,循环结构,for循环示例二:显示$PATH变量中各目录的名称。rootserverroot#cate20.sh#!/bin/bashIFS=:fordirin$PATHdols-ld$dirdoneechoFinished!,.,循环结构,执行:rootserverroot#./e20.shdrwxr-xr-x2rootroot4096Feb71996/usr/local/bindrwxr-xr-x2rootroot4096Feb182003/bindrwxr-xr-x2rootroot36864Aug2422:00/usr/bindrwxr-xr-x2rootroot4096Feb182003/usr/X11R6/binFinished!,.,循环结构,for循环示例三:与C语言相似的格式用法。rootserverroot#cat./e21.sh#!/bin/bashfor(i=1;i=6;i+)dofor(j=1;j=i;j+)doecho-e*cdoneechodone,.,循环结构,rootserverroot#./e21.sh*,.,循环结构,while循环的格式如下:while条件do语句1语句2done,.,循环结构,while循环示例:逐行显示一个文本文件的内容,忽略以符号“#”开头的行,并在所显示的每一行前加上行号。rootserverroot#cate23.sh#!/bin/bashcounter=1whilereadlinedoif!$line:0:1=#;thenecho$counter:$linecounter=$counter+1fidone$1,.,循环结构,rootserverroot#./e23.she23.sh1:counter=12:whilereadline3:do4:if!$line:0:1=#;then5:echo$counter:$line6:counter=$counter+17:fi8:done$1,.,循环结构,until控制结构,形式:until循环条件do程序段done,.,循环结构,实现循环输入结束的字母,直到符合条件时退出循环viuntil#!/bin/bashechopressy/Ytostop.readinputuntil$input=Y|$input=ydoechoerrorinput,pleasetryagain.readinputdoneechostophere,.,循环结构,break和continuebreak命令允许跳出循环,通常在进行一些处理后退出循环或case语句continue的作用是跳出本次循环,进行下次循环,一个不带参数的continue命令只去掉本次循环的剩余代码,而continueN将会把N层循环剩余的代码都去掉,但是循环的次数不变,.,循环结构,#!/bin/bashforiin“x”“y”“z”doecho$iforjinseq8#seq命令用来打印一个序列,后跟数字时从1开始doif$j-eq4;thenbreakfiecho“$j”donedone,.,shell函数,函数的定义在shell中定义函数有两种格式:functionfuncnameshellcommands或funcname()shellcommands,.,shell函数,定义函数示例:定义一个shell函数。rootserverroot#cate29.sh#!/bin/bashmyfunction()echoHello,world!,.,shell函数,调用shell函数示例:利用select循环、case语句

温馨提示

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

评论

0/150

提交评论