Linux操作系统-总复习-第十一章.ppt_第1页
Linux操作系统-总复习-第十一章.ppt_第2页
Linux操作系统-总复习-第十一章.ppt_第3页
Linux操作系统-总复习-第十一章.ppt_第4页
Linux操作系统-总复习-第十一章.ppt_第5页
已阅读5页,还剩77页未读 继续免费阅读

下载本文档

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

文档简介

1、Linux操作系统,总复习,11.1 shell概述 11.2 shell变量 11.3 shell的控制结构 11.4 shell应用实例 11.5 小结,第十一章 shell程序设计,11.1 shell概述,11.1.1 什么是shell shell是一种命令解释程序,shell解释用户输入的命令行,提交系统内核处理,并将结果返回给用户。一旦用户登录到系统后,shell就被系统装入内存,并一直运行到用户退出系统之止;而一般命令仅当被调用时,才由系统装入内存执行。,shell本身也是一种可编程的程序设计语言。用shell写的程序(shell脚本)相当于dos/windows下的批处理文件,

2、它可以简单到只有一条命令,也可以复杂到包括大量循环、条件语句、数学运算、控制结构,也可以是介于两者之间的程序。,11.1.3 Shell程序的创建与执行,用任一文本编辑器创建shell文件 (xxx)(例如:$ vi xxx) 将shell文件改为可执行文件(例如:$ chmod u+x xxx) 执行shell文件(例如:$ ./ xxx),11.1.4 Shell程序示例,在/home/test文件夹下运行vi 在新建空白文档中输入如下内容:datepwdls 保存文件到/home/test/xxx中 修改文件权限,运行“系统工具”中“终端”,输入:chmod u+x xxx 输入 ./x

3、xx ,11.2 shell变量,11.2.1 shell变量描述 shell实际上是基于字符串的程序设计语言,但也有变量。shell变量能够而且只能存储正文字符串,即它只有一种类型的变量即串变量。 变量的名字必须以字母或下划线开头,可以包括字母、数字和下划线。,11.2.2 用户自定义变量 用户自定义变量语法格式:name=string,赋值号“=”两边不允许有空白符。 例: nodehost=beijing.UUCP path=/bin:/usr/bin:/etc/bin count=10,例: # B=abc A=B C=OK # echo A B C abc abc OK 当引用一个未

4、设置的变量时,其隐含值为空。 例: # echo mail is path of mailbox is path of mailbox,11.2.3 shell中的特殊字符 1.双引号 (“”) 如果用双引号“”将值括起来,则括起来的字符串允许出现空格、制表符和换行符等特殊字符,而且允许有变量替换。,例1: # MAIL=/var/mail/fk # var=MAIL is path of mailbox # echo var /var/mail/fk is path of mailbox 例2: # str=This is n a book # echo e str This is a bo

5、ok,双引号内能保留原有含意的字符有:、 、!、 例1: #echo Type a *, please Type a *, please 例2: #echo today is date 显示当前时间 例3: #echo !3 ,2. 单引号() 使用单引号消除被括在单引号中的所有特殊字符的含义,即单引号表示内容照原样不动。 例1: # BOOK=English book # MSG=BOOK # echo MSG - echo $MSG # $BOOK $MSG 例2: # msg= Today is date # echo msg Today is date,3.反撇号() 当一个字符串被括

6、在反撇号“ ”中时,该字符串将作为命令被shell解释执行,即用命令的执行结果替换这个字符串本身。要注意反撇号与单引号的区别。 例1: # lm=pwd # echo lm /root,例2: # now=date # echo now date # now=date # echo now 1998年 10月 28日 星期三 17时 51分 56秒 CST 例3: #echo Hostname:hostname,$()的功能与一样 例1: #now=$(date) #echo $now 例2: #echo $(pwd) 例3: #echo Hostname:$(hostname) ,4.转义符

7、() 使用转义符消除单个字符的特殊含义,即将紧跟在转义符后面的单个字符按字符本身的实际含义解释。 例1: #echo your cost is $5.00 #echo your cost is $5.00 #echo your cost is $5.00,例2:转义符具有续行功能 #ls -l #ls -l 例3: echo * 00000 * echo * 00000 * echo * 00000 * echo * 00000 *,5.大括号 引用变量的值时,可以用花括号将变量名称括起来,使变量名称与它的后续字符分隔开,如果紧跟在变量名称后面的字符是字母、数字或下划线时,必须要使用花括号。

8、例1: #num=2#echo this is the $numnd #echo this is the $numnd,例2: #str=This is a string #echo strent test of variables This is a stringent test of variables #echo strent test of variables test of variables,11.2.4 常用命令 1.echo命令 显示变量内容 # echo $variable,2.set命令 显示目前系统中全部的变量内容 # set 3.unset命令 直接将该变量的内容拿掉:

9、 # unset 变量名,4.read命令 上面讲的变量都是直接设定的!那么是否可以让变量内容是由使用者由键盘输入呢? 可以使用 read 命令,这个命令在脚本里面是比较重要的。 # read name testing =此时屏幕会等待使用者由键盘输入! # echo $name testing =刚刚输入的数据变成了变量的内容!,数学运算-$ #a=3 #b=5 #c=7 #echo $a+$b #echo $a*$b #echo $a/$b #echo $a%$b #echo $a*$b,数学运算expr #a=3 #b=5 #expr $a + $b #expr $a - $b #exp

10、r $a / $b #expr $a * $b,11.2.5 位置变量 位置变量顾名思义是与变量所在位置有关的变量,这是一种特殊的变量。当一个shell过程被调用时,shell隐含地为它建立一系列的位置变量。这种位置变量是系统预定义好的,可以直接引用。如命令行的shell过程名本身被指定为位置变量0,第一个命令参数为1,第九个命令参数为9。 例: ls / /bin /etc /usr/bin /dev 0 1 2 3 4 5,# vi test11-1.sh #!/bin/bash # This program will define what is the parameters echo

11、This scripts name = $0 echo parameters $1 $2 $3 # sh test11-1.sh pa1 pa2 pa3 This scripts name = test11-1.sh parameters pa1 pa2 pa3,11.2.7 预定义的特殊变量 在shell中有一组特殊的变量,其变量名和变量值只有shell本身才可以设置。 “#” 记录传递给shell的自变量(参数)个数。 例1: sh mytxt a b c /则#的值为3 例2:(test11-2.sh) if test # -lt 2 then echo two or more args

12、 required exit fi,“?”取最近一次命令执行后的退出状态:执行成功返回码为0,执行失败返回码为1。 例: $cd /home $echo $? 0 cd /abcd echo? 1,“$*”和“$”都表示传递给函数的所有参数,两者的区别是“$*”把所有的参数作为一个整体,而“$”把所有参数看作拥有多个参数的集合,可以单独访问每一个变量。,# vi test11-3.sh echo para $* is:$* echo para $ is:$ count=1 for para in $ do echo para $count is: $para let count=$count+

13、1 done,#test11-3.sh pa1 pa2 pa3 para $* is:pa1 pa2 pa3 para $ is:pa1 pa2 pa3 para $1 is: pa1 para $2 is: pa2 para $3 is: pa3,11.3 shell控制结构,11.3.1 条件与test命令 在程序设计语言中,作出决策的结构称为条件。在高级语言中决策的作出是依赖于基本运算的结果;在shell语言中,作出决策所依赖的条件是所执行命令的“出口状态”。,1. test命令 test命令是shell程序设计的条件判断中最常用的测试命令,它有两种等价的格式: test express

14、ion或 expression (注意: 中的空格) 其中expression就是要测试的条件。如果test计算expression的结果为真,则返回“零”出口状态,否则返回“非零”出口状态。test命令可用于对字符串、整数及文件进行各类测试。,2. test字符串测试表达式 例1: 两个字符串进行比较 user=smith test user= smith echo ? 0 test user = tom echo ? 1,例2:比较字符串的长度 sym=hello test -z sym $ echo $? 1 $ test -n $sym $ echo $? 0,4. test命令可用于

15、整数比较 首先要搞清楚整数比较的两个概念: shell并不区分放在shell变量中的值的类型,就变量本身而言,它存放的仅仅是一组字符串,即shell只有一种类型的变量串变量;当使用整数比较操作符时,是test命令来解释存放在变量中的整数值,而不是shell。 命令格式为, test 整数测试表达式,例1: x1= 005 x2= 10 test x1 = 5 echo ? 1 例2: test x1 -eq 5 echo ? 0 例3: test x2 -eq 10 echo ? 0,5. test用于文件的测试 test可用于文件各种特性的检查。这些文件的操作符自然是一原操作符,意味着它们要

16、求其后跟随一个自变量。在所有的情况中,这个自变量是一个文件或目录名。常用的文件测试表达式示例如下:,例1: 检查指定的文件是否存在且为普通文件 test -f /usr/fk/message 例2: 检查指定的文件是否为目录 test -d /usr/src/local/sendmail,6. 表达式的逻辑运算 在实际应用中常需要将多个表达式用逻辑运算符组合起来,构成比较复杂的条件。逻辑运算符包括: ! : 逻辑非单目运算符,可放置在任何其他test表达式之前,求得表达式运算结果的非值。 -a :逻辑与运算符,执行两个表达式的逻辑与运算,并且仅当两者都为真时,才返回真值。 -o :逻辑或运算符

17、,执行两个表达式的逻辑或运算,并只要当两者之一为真时,就返回真值。 逻辑运算符优先级(由高到低) 的排列顺序如下: ( ) ! -a -o,逻辑运算符优先级要比字符串操作符、数字比较操作符、文件操作符的优先级低。 例1: 当指定的文件不可读时为真。 test ! -r /usr/fk/message 例2: 当指定的文件均存在,且message为可读、mailfile 指定的文件为普通文件时,返回真。 test -r /usr/fk/message -a -f mailfile ,例3: 当变量值大于等于0并且小于10时为真。 test count -ge 0 -a count -lt 10

18、例4: 当变量a等于0或者b大于5,并且c小于等于8时为真。 test ( a -eq 0 -o b -gt 5 ) -a c -le 8,11.3.2 控制结构,常见分支结构: if case 常见循环结构: for while until,格式:,说明: 中括号中的部分可省略; 当条件为真(0)时执行then后面的语句,否则执行else后面的语句; 以fi作为if结构的结束。,if 条件1 then 命令 elif 条件2 then 命令 else 命令 fi,1. if结构,Vi test11-4.sh #!/bin/bash # This program is used to stud

19、y if then echo Press y to continue read yn if $yn = y ; then echo script is running. else echo STOP! fi,# sh test11-4.sh Press y to continue y script is running. # sh test-4.sh Press y to continue n STOP!,但是这里有个问题,就是如果我输入为 Y 时,程序还是停止了,怎么办?这个时候就需要使用到 | ,我们可以这样写: vi test11-5.sh #!/bin/bash # This prog

20、ram is used to study if then echo Press y to continue read yn if $yn = y | $yn = Y ; then echo script is running. else echo STOP! fi,# sh test11-5.sh Press y to continue y script is running. # sh test11-5.sh Press y to continue Y script is running.,如果再加上前面提过的: parameter 的选用呢? Vi test11-6.sh #!/bin/b

21、ash # set parameters in the if then # 需要加上 hello 这个参数才会显示正确的! if $1 = hello ; then echo Hello! How are you ? elif $1 = ; then echo You must input parameters else echo The only accept parameter is hello fi,# sh test11-6.sh hello Hello! How are you ? # sh test11-6.sh You must input parameters # sh tes

22、t11-6.sh djdkf The only accept parameter is hello,例:逻辑判断式的使用方式 1.先查看一下当前目录下logical 这个名称是否存在; 2.若不存在,则建立一个文件,使用 touch 来建立,建立完成后离开; 3.如果存在的话,判断该名称是否为文件,若为文件则将之删除后建立一个目录,名为 logical ,之后离开; 4.如果存在的话,而且该名称为目录,则移除此目录!,Vi test11-7.sh #!/bin/bash # using if and then to select file or directory if ! -e logica

23、l ; then touch logical echo Just make a file logical exit 1 elif -e logical then rm -rf logical echo remove directory = logical exit 1 else echo Does here have anything? fi,2. case结构,格式:,说明: “条件”可以是变量、表达式、shell命令等; “模式”为条件的值,并且一个“模式”可以匹配多种值,不同值之间用竖线(|)联结 ; 一个模式要用双分号(;)作为结束 ; 以逆序的case命令(esac)表示case分支

24、语句的结束,case 条件 in 模式1) 命令1 ; 模式2) 命令2 ; . 模式n) 命令n ; esac,Vi test11-8.sh #!/bin/bash case $1 in start | begin) echo start something ; stop | end) echo stop something ; *) echo Ignorant ; esac,例:判断系统在哪一种平台上! Vi test11-9.sh #!/bin/bash SYSTEM=uname-s case$SYSTEMin Linux) echoMysystemisLinux echoDoLinux

25、stuffhere. ; FreeBSD) echoMysystemisFreeBSD echoDoFreeBSDstuffhere. ; *) echoUnknownsystem:$SYSTEM echoIdontwhattodo. ; esac,3. for结构,格式,说明: “列表”为存储了一系列值的列表,随着循环的进行,变量从列表中的第一个值依次取到最后一个值; do和done之间的命令通常为根据变量进行处理的一系列命令,这些命令每次循环都执行一次; 如果中括号中的部分省略掉,Bash则认为是“in $”,即执行该程序时通过命令行传给程序的所有参数的列表。,for 变量 in 列表 d

26、o 命令(通常用到循环变量) done,Vi test11-10.sh #!/bin/bashWORD=a b c d e f g h i j l m n o p q r s t u v w x y zfor i in $WORD ; do echo $i done,4. while与until结构,格式:,说明: while循环中,只要条件为真,就执行do和done之间的循环命令; until循环中,只要条件不为真,就执行do和done之间的循环命令,或者说,在until循环中,一直执行do和done之间的循环命令,直到条件为真; 避免生成死循环。,while/until 条件 do 命令

27、done,Vi test11-12.sh #!/bin/bash x=1 while $x -lt 5 do mm=expr $x * $x echo $mm x=$x+1 done echo the while is end!,结果是: 1 4 9 16 the while is end!,Vi test11-13.sh #!/bin/bash x=1 until $x -ge 5 do mm=expr $x * $x echo $mm x=$x+1 done echo the until is end!,结果是: 1 4 9 16 the while is end!,循环体中的其它命令,1

28、. break命令 格式为: break或break n break是shell的内部命令,用于在循环体中根据命令运行的返回条件,直接终止循环体内命令的执行。当执行break命令时,控制流从循环体中转移到done之后的第一条命令上。当执行break n命令时,则终止最内层的n个循环的执行。,2. continue 命令 格式为, continue或continue n continue是shell的内部命令,用于在循环体中根据命令运行的返回条件,直接进入下一次循环命令的执行。当执行continue命令时,控制流直接转到本循环体中第一条命令上。当执行continue n命令时,则跳过最里层的 n

29、次循环体的执行,即开始第n个(从内向外数) 循环的下一个循环过程。,#测试continue (test11-14.sh) #!/bin/bashI=1 I=$I + 1while $I -lt 10 do if $I -eq 3 then continue fi if $I -eq 7 then break fi echo $I done 修改上面程序,结果如下: 2456,Vi test11-15.sh Sum=0 i=0 while true do i=expr $i + 1 Sum=expr $Sum + $i if $i = 100 then break fi done echo $i

30、 $Sum 这个程序的运算就是将1到100加起来,最后这个程序显示的是 100 5050,Vi test11-16.sh #!/bin/bash Sum=0 i=0 while $i != 100 do i=expr $i + 1 Sum=expr $Sum + $i done echo $i $Sum,5. function,格式: 定义: 引用:,说明: 中括号中的部分可以省略; 如果在函数内部需要使用传递给函数的参数,一般用$0、$1、.、$n,以及$#、$*、$这些特殊变量 : $0为执行脚本的文件名 $1是传递给函数的第1个数 $#为传递给函数的参数数 $*和$为传递给函数的所参数,

31、function 函数名() 命令 ,函数名 参数1 参数2 .参数n ,在任何Shell中都可以定义函数,包括交互式Shell。 例如: #function dir() ls -l; 结果是我们在#后面打dir,其显示结果同ls -l的作用是相同的。 该dir函数将一直保留到用户从系统退出,或执行了如下所示的unset命令: #unset dir,在脚本中使用函数 #vi func1.sh #!/bin/bash function hello() echo hello there todays date is date ; hello 运行脚本:# sh func1.shhello ther

32、e todays date is 三 12月 3 17:00:08 CST 2008,使用shift,我们要学个非常有用的命令:shift。对于位置变量或命令行参数,其个数必须是确定的,或者当Shell程序不知道其个数时,可以把所有参数一起赋值给变量$*。若用户要求Shell在不知道位置变量个数的情况下,还能逐个的把参数一一处理,可以使用shift命令,#测试shift命令(x_shift1.sh) #!/bin/bash until $# -eq 0 do echo “first para is: $1 sum is: $#” shift done 执行以上程序x_shift1.sh: $./x_shift.sh 1 2 3 4,结果显示如下: first para is : 1 sum is : 4 first para is : 2 sum is : 3 first

温馨提示

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

评论

0/150

提交评论