Linux网络环境管理第四章Shell编程课件实验作业视频认证题库4.1shell命令行书写规则4.2编写/修改权限及执行shell程序的步骤4.3在shell程序中使用的参数4.4在shell程序中使用的变量4.5表达式的比较4.6循环结构语句4.7条件结构语句4.8在shell脚本中使用函数4.9在shell脚本中调用其他shell脚本4.1shell命令行书写规则•对shell命令行基本功能的理解有助于编写更好的shell程序,在执行shell命令时多个命令可以在一个命令行上运行,但此时要使用分号(;)分隔命令。•例如:•[root@localhostroot]#lsa*-l;free;df•长shell命令行可以使用反斜线字符(\)在命令行上扩充。•例如:•[root@localhostroot]#echothisis\•longcommand•thisislongcommand•注意:“”符号是自动产生的,而不是输入的。4.2编写/修改权限及执行shell程序的步骤•shell程序有很多类似C语言和其他程序设计语言的特征,但是又没有程序语言那样复杂。shell程序是指放在一个文件中的一系列Linux命令和实用程序。在执行的时候,通过Linux操作系统一个接着一个地解释和执行每条命令。首先,编写第一个shell程序,从中学习shell程序的编写、修改权限、执行过程。•4.2.1编辑shell程序•编辑一个内容如下的源文件,文件名为date,可将其存放在目录/bin下。•[root@localhostbin]#vidate1因为系统中已经有date文件•#!/bin/sh•echoMr.$USER,Todayis:•echo&date+%B%d%A•echoWishyoualuckyday!“•注意:#!/bin/sh通知采用bash解释。如果在echo语句中执行shell命令date,则需要在date命令前加符号“&”,其中%B%d%A为输出格式控制符。4.2编写/修改权限及执行shell程序的步骤4.2编写/修改权限及执行shell程序的步骤•4.2.2建立可执行的程序•编辑完该文件之后不能立即执行该文件,需给文件设置可执行权限。使用如下命令:•Chmod+x/bin/date14.2编写/修改权限及执行shell程序的步骤•4.2.3执行shell程序•方法一:•[root@localhostbin]#./date[root@local桌面]#/bin/date1•Mr.root,Todayis:•二月06星期二•Wishyoualuckyday!•方法二:•另外一种执行date的方法就是把它作为一个参数传给shell命令:•[root@localhostbin]#bashdate•Mr.root,Todayis:•二月06星期二•Wishyoualuckyday!•方法三:•为了在任何目录都可以编译和执行shell所编写的程序,即把/bin的这个目录添加到整个环境变量中。•具体操作如下:•[root@localhostroot]#exportPATH=/bin:$PATH•[root@localhostroot]#date•Mr.root,Todayis:•二月06星期二•Wishyoualuckyday!4.2编写/修改权限及执行shell程序的步骤4.2编写/修改权限及执行shell程序的步骤•例4.1•编写一个shell程序mkf,此程序的功能是:显示root下的文件信息,然后建立一个kk的文件夹,在此文件夹下新建一个文件aa,修改此文件的权限为可执行。•分析:此shell程序中需要依次执行下列命令:•进入root目录:cd/root•显示root目录下的文件信息:ls–l•新建文件夹kk:mkdirkk•进入root/kk目录:cdkk•新建一个文件aa:viaa#编辑完成后需手工保存•修改aa文件的权限为可执行:chmod+xaa•回到root目录:cd/root•因此此shell程序只是以上命令的顺序集合,假定程序名为mkf。•[root@localhostroot]#vimkf•cd/root•ls–l•mkdirkk•cdkk•viaa•chmod+xaa•cd/root4.2编写/修改权限及执行shell程序的步骤4.3在shell程序中使用的参数•如同Is命令可以接受目录等作为它的参数一样,在shell编程时同样可以使用参数。shell程序中的参数分为位置参数和内部参数等。4.3在shell程序中使用的参数•4.3.1位置参数•由系统提供的参数称为位置参数。位置参数的值可以用$N得到,N是一个数字,如果为1,即$1。类似C语言中的数组,Linux会把输入的命令字符串分段并给每段进行标号,标号从0开始。第0号为程序名字,从1开始就表示传递给程序的参数。如$0表示程序的名字,$1表示传递给程序的第一个参数,以此类推。4.3在shell程序中使用的参数•4.3.2内部参数•上述过程中的$0是一个内部变量,它是必需的,而$1则可有可无,最常用的内部变量有$0、$#、$?、$*,它们的含义如下。•$0:命令含命令所在的路径。•$#:传递给程序的总的参数数目。•$?:shell程序在shell中退出的情况,正常退出返回0,反之为非0值。•$*:传递给程序的所有参数组成的字符串。4.3在shell程序中使用的参数•例4.2编写一个shell程序,用于描述shell程序中的位置参数$0、$#、$?、$*,程序名为test1,代码如下。•(1)用vi编辑程序•[root@localhostbin]#vitest1•#!/bin/sh•echoProgramnameis$0;•echoTherearetotally$#parameterspassedtothisprogram;•echoThelastis$?;•echoTheparametersare$*;•(2)设置权限•[root@localhostbin]#chmod+xtest1•(3)运行•[root@localhostbin]#test1thisisatestprogram//传递5个参数•Programnameis/bin/test1//给出程序的完整路径和名字•Therearetotally5parameterspassedtothisprogram//参数的总数•Thelastis0//程序执行结果•Theparametersarethisisatestprogram//返回由参数组成的字符串4.3在shell程序中使用的参数•例4.3利用内部变量和位置参数编写一个名为test2的简单删除程序,如删除的文件名为a,则在终端输入的命令为test2a。•分析:除命令外至少还有一个位置参数,即$#不能为0,删除的文件为$1,程序设计过程为如下。••(1)用vi编辑程序•[root@localhostbin]#vitest2•#!/bin/sh•iftest$#-eq0•then•echoPleasespecifyafile!•else•gzip$1•mv$1.gz$HOME/dustbin//先对文件进行压缩•echoFile$1isdeleted!//移动到回收站4.3在shell程序中使用的参数•(2)设置权限•[root@localhostbin]#chmod+xtest2•(3)运行•[root@localhostbin]#test2a(假设a文件在bin目录下存在)•Fileaisdeleted!4.4在shell程序中使用的变量•4.4.1变量的赋值•在shell编程中,所有的变量名都由字符串组成,并且不需要对变量进行声明。要赋值给一个变量,其格式如下:•变量名=值•例如:•x=6•a=Howareyou•表示把6赋值给变量x,字符串“Howareyou”赋值给变量a。•注意:等号(=)前后没有空格。4.4在shell程序中使用的变量•4.4.2访问变量值•如果要访问变量值,可以在变量前面加一个美元符号“$”,例如:•a=Howareyou•echoHejustsaid:$a•输出:•Hejustsaid:Howareyou•一个变量给另一个变量赋值可以写成:•变量2=$变量1•例如:•x=$i•i++可以写为:•i=$i+14.4在shell程序中使用的变量•4.4.3键盘读入•在shell程序设计中,变量的值可以作为字符串从键盘读入,其格式为:•read变量•例如:•readstr•read为读入命令,它表示从键盘读入字符串到str。4.4在shell程序中使用的变量•例4.4编写一个shell程序test3,程序执行时从键盘读入一个目录名,然后显示这个目录下所有文件的信息。•分析:•设存放目录的变量为DIRECTORY,其读入语句为:readDIRECTORY•显示文件的信息命令为:ls–al•(1)用vi编辑程序•[root@localhostbin]#vitest3•#!/bin/sh•echopleaseinputnameofdirectory•readDIRECTORY•cd$DIRECTORY•ls–l•(2)设置权限•[root@localhostbin]#chmod+xtest3•(3)执行•[root@localhostbin]#/bin/test34.4在shell程序中使用的变量•例4.5运行程序test4,从键盘读入x、y的值,然后做加法运算,最后输出结果。•(1)用vi编辑程序•[root@localhostbin]#vitest4•#!/bin/sh•readxy•z='expr$x+$y'•echoThesumis$z•(2)设置权限•[root@localhostbin]#chmod+xtest4•(3)执行•[root@localhostbin]#./test4•4578•Thesumis123注意:表达式z=‘expr$x+$y’中的符号“‘”为键盘上的“”。4.5表达式的比较•在Shell程序中,通常使用表达式比较来完成逻辑任务。表达式所代表的操作符有字符、串操作符、数字搡作符、逻辑操作符以及文件操作符。其中文件操作符是一种shell所独特的操作符,因为shell里的变量都是字符串,为了达到对文件进行操作的目的,于是才提供了文件操作符。•4.5.1字符串比较•作用:测试字符串是否相等、长度是否为零,字符串是否为NULL。•常用的字符串操作符如下表所示。•表4.1常用的字符串操作符注意:“[”后面和“]”前面及等号“=”的前后都应有一空格;注意这里是程序的退出情况,如果ar1和ar2的字符串是不相等的为非正常退出,输出结果为1。•例4.6从键盘读入两个字符串,判断这两个字符串是否相等,如相等输出。•(1)用vi编辑程序•[root@localhostbin]#vitest5•#!/bin/bash•readar1•readar2•[$ar1=$ar2]•echo$?#?保存前一个命令的返回码•(2)设置权限•[root@localhostbin]#chmod+xtest5•(3)执行•[root@localhostroot]#./test5•aaa•bbb•14.5表达式的比较注意:运行结果1表示ar的小于等于零,0表示ar的长度大于零。4.5表达式的比较•例4.7比较字符串长度是否大于零。•(1)用vi编辑程序•[root@localhostbin]#vitest6•#!/bin/bash•readar•[-n$ar]•echo$?#保存前一个命令的返回码•(2)设置权限•[root@localhostbin]#chmod+xtest6•(3)执行•[root@localhostroot]#./test64.5表达式的比较•4.5.2数字比较•在bashshell编程中的关系运算有别于其他编程语言,用表4.2中的运算符用test语句来表示大小的比较。•表4.2用test比较的