第三讲 Shell编程2.ppt_第1页
第三讲 Shell编程2.ppt_第2页
第三讲 Shell编程2.ppt_第3页
第三讲 Shell编程2.ppt_第4页
第三讲 Shell编程2.ppt_第5页
已阅读5页,还剩36页未读 继续免费阅读

下载本文档

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

文档简介

1、主要内容,Shell脚本基本编程 Shell脚本高级部分,基本脚本编程,条件测试 流程控制,基本脚本编程条件测试,if语句用于条件控制结构中,其一般格式为: if 测试条件 then 命令1 else 命令2 fi 其中,if、then、else和fi是关键字。例如: if test -f $1 then echo $1 is an ordinary file . else echo $1 is not an ordinary file . fi,if语句中else部分可以缺省。例如, if test -f $1 then echo $1 is an ordinary file . fi if

2、 语句的else部分还可以是elseif结构,则用关键字“elif”代替“else if”。例如, if test - f $1 then pr $1 elif test - d $1 then ( cd $1 ; pr * ) else echo $1 is neither a file nor a directory . fi,if的语句的更一般形式是: if 命令表1 then 命令表2 else 命令表3 fi,基本脚本编程条件测试,条件测试有三种常用形式:一种是用test 命令,如上所示。另一种是用一对方括号将测试条件括起来。这两种形式是完全等价的。例如,测试位置参数$1是否是已存在

3、的普通文件,可写为: test -f $1 也完全可写成: -f $1 第三种形式是: 条件表达式 test命令可以和多种系统运算符一起使用。这些运算符可以分为四类:文件测试运算符、字符串测试运算符、数值测试运算符和逻辑运算符。,基本脚本编程条件测试,例:if结构,#!/bin/sh If $? eq 0 Then echo “command was sucessful.” else echo “An error was encountered.” fi exit #命令执行后返回值为0,报告命令执行成 #功,否则报告出错。,基本脚本编程 CASE语句,case语句允许进行多重条件选择。其一般

4、语法形式是: case 字符串 in 模式字符串1) 命令 命令; 模式字符串n) 命令 命令; esac,在使用case语句时应注意: 每个模式字符串后面可有一条或多条命令,其最后一条命令必须以两个分号(即;)结束。 模式字符串中可以使用通配符 如果一个模式字符串中包含多个模式,那么各模式之间应以竖线(|)隔开,表示各模式是“或”的关系,即只要给定字符串与其中一个模式相配,就会执行其后的命令表,基本脚本编程 CASE语句, 各模式字符串应是唯一的,不应重复出现。并且要合理安排它们的出现顺序。 case语句以关键字case开头,以关键字esac(是case倒过来写!)结束。 case的退出(返

5、回)值是整个结构中最后执行的那个命令的退出值。若没有执行任何命令,则退出值为零,基本脚本编程 CASE语句,例:case结构,#!/bin/sh echo “Enter A,B,C” read letter case $letter in A|a) echo “you entered A;” B|b) echo “you entered B;” C|c) echo “you entered C” *) echo “not A,B,C” esac,shell中有三种用于循环的语句,它们是: (1)while语句 (2)until语句 (3)for语句,基本脚本编程流程控制,while语句的一般形

6、式是: while 测试条件 do 命令表 done 其执行过程是:先进行条件测试,如果结果为真,则进入循环体(do-done之间部分),执行其中命令,然后在做条件测试直至测试条件为假时,才终止while语句的执行。,基本脚本编程while语句,测试条件部分除使用test命令或等价的方括号外,还可以是一组命令。根据其最后一个命令的退出值决定是否进入循环体执行。 echo “key in file name-c” read filename echo “key in data:” while read x do echo $x$filename done cat $filename,基本脚本编程

7、while语句,例:while结构,#!/bin/sh x=0 while “$x” lt 10 do echo -n “$x” x=expr $x+1 done,until语句的一般形式是: until 测试条件 do 命令表 done 它与while语句很相似,只是测试条件不同:当测试条件为假时,才进入循环体,直至测试条件为真时终止循环。,基本脚本编程until语句,例:until结构,#!/bin/sh x=1 until $x ge 10 do echo “$x” x=expr $x+1 done,for arg in list do command(s). done 注意:在循环的每

8、次执行中,arg 将顺序的存取 list中列出的变量。 list 中的参数允许包含通配符。,基本脚本编程for语句,4.9.6 for语句,其使用方式主要有两种:一种是值表方式,另一种是算术表达式方式。 1值表方式 其一般格式是: for 变量 in 值表 ;do 命令表;done 根据循环变量的取值方式,其使用格式可分为三种: 格式一:循环变量取自给出的值表 for 变量 in 值表 do 命令表 done,基本脚本编程for语句,格式二:值表可以是文件正则表达式 for 变量 in 文件正则表达式 do 命令表 done 格式三:值表可以是全部位置参数 for i in $* 或者 for

9、 i do do 命令表 命令表 done done,基本脚本编程for语句,2算术表达式方式 其一般格式是: for (e1;e2;e3) do 命令表 done 其中,e1, e2, e3是算术表达式。它的执行过程与C语言中for语句相似,即: 先按算术运算规则计算表达式e1; 接着计算e2,如果e2值不为0,则执行命令表中的命令,并且计算e3;然后重复,直至e2为0,退出循环。,基本脚本编程for语句,例:for结构,#!/bin/sh for i in 0 1 2 3 4 5 6 7 8 9 do echo i done,for file in * do ls -l “$file” #

10、 列出所有在 当前目录中的所有文件 done,for file in jx* do rm -f $file # 只删除当前目录下以j或x开头的文件. echo Removed file $file. done,例:for结构,1break命令 break命令使程序从循环体中退出来。其语法格式是: break n 2continue命令 continue命令跳过循环体中在它之后的语句,回到本层循环的开头,进行下一次循环。其语法格式是: continue n ,break命令和continue命令,exit命令的功能是立即退出正在执行的shell脚本,并设定退出值。其语法格式是: exit n ,

11、exit命令,Shell编程题目,编写程序列出系统上的所有用户。 在目录的所有文件中查找指定的源字串。,Shell脚本高级部分,函数 调试 其他,在shell脚本中可以定义并使用函数。其定义格式为: function函数名( ) 命令表 函数应先定义,后使用。调用函数时,直接利用函数名,如showfile,不必带圆括号; shell脚本与函数间的参数传递可利用位置参数和变量直接传递; 通常,函数中的最后一个命令执行之后,就退出被调函数。也可利用return命令立即退出函数,其语法格式是: return n ,高级脚本编程函数,函数,1 #!/bin/bash 2 3 JUST_A_SECOND

12、=1 4 5 funky () 6 # 这是一个最简单的函数. 7 echo This is a funky function. 8 echo Now exiting funky function. 9 # 函数必须在调用前声明. 10 11,12 fun () 13 # 一个稍复杂的函数. 14 i=0 15 REPEATS=30 16 17 echo 18 echo And now the fun really begins. 19 echo 20 21 sleep $JUST_A_SECOND # 嘿, 暂停一秒! 22 while $i -lt $REPEATS 23 do 24 ec

13、ho -FUNCTIONS- 25 echo 27 echo 28 let i+=1 29 done 30 31,函数,函数可以处理传递给它的参数并且能返回它的退出状态码(exit status)给脚本后续使用。 函数以位置来引用传递过来的参数例如$1, $2,以此类推。,函数的退出和返回,退出状态(exit status) 函数返回一个被称为退出状态的值. 退出状态可以由 return 来指定 statement, 否则函数的退出状态是函数最后一个执行命令的退出状态(0 表示成功,非 0 表示出错代码). 退出状态 (exit status)可以在脚本 $? 引用. 这个机制使脚本 C 函数

14、一样有一个 返回值. return 终止一个函数 return 命令可选地带一个整数参数,这个整数作为函数的返回值返回 给调用此函数的脚本,并且这个值也被赋给变量$?.,1 #!/bin/bash 2 # max.sh: 两个整数中的最大者. 3 4 E_PARAM_ERR=-198 # 如果传给函数的参数少于 2 个时的返回值. 5 EQUAL=-199 # 如果两个整数值相等的返回值. 6 # 任一个传给函数的参数值溢出 7 # 8 9 max2 () # 返回两个整数的较大值. 10 # 注意: 参与比较的数必须小于 257. 11 if -z $2 12 then 13 return

15、$E_PARAM_ERR 14 fi,15 16 if $1 -eq $2 17 then 18 return $EQUAL 19 else 20 if $1 -gt $2 21 then 22 return $1 23 else 24 return $2 25 fi 26 fi 27 ,28 29 max2 33 34 30 return_val=$? 31 32 if $return_val -eq $E_PARAM_ERR 33 then 34 echo Need to pass two parameters to the function. 35 elif $return_val -e

16、q $EQUAL 36 then 37 echo The two numbers are equal. 38 else 39 echo The larger of the two numbers is $return_val. 40 fi,调试,Bash shell 没有自带调试器,甚至没有任何调试类型的命令或结构。 脚本里的语法错误或拼写错误会产生含糊的错误信息,通常这些在调试非功能性的脚本时没有什么帮助。,通常采用自底向上的方法,即:先搞清楚要脚本做什么,然后将过程的连续阶段分解为独立的步骤,最后利用shell提示符,交互式地检查和调试每个独立的步骤。 编写的脚本无法执行的原因除脚本文件缺

17、少“执行”权限外,有两种可能:执行脚本的环境设置不对和脚本本身有错误。,调试,4.13.1 解决环境设置问题, 不能直接在其他shell下运行bash脚本,解决的办法是在脚本的第一行写上:#!/bin/bash 在PATH环境变量中没有包括“.”(当前工作目录)。 解决办法是设置PATH: PATH=$PATH:. 脚本文件与已存在命令的名字相同。,调试,错误的脚本,1 #!/bin/bash 2 # ex74.sh 3 4 # 这是一个错误的脚本. 5 # 哪里有错? 6 7 a=37 8 9 if $a -gt 27 10 then 11 echo $a 12 fi 13 14 exit 0,脚本 : ./ex74.sh: 37: command not found 上面的脚本有什么错误 (线索: 注意 if 的后面)?,丢失关键字(keyword) 1 #!/bin/bash 2 # missing-keyword.sh: 会产生什么样的错误信息? 3 4 for a in 1 2 3 5 do 6 echo $a 7 # done # 第7 行的必需的关键字 done 被注释掉了. 8 9 exit 0,脚本 : missing-keyword.sh: line

温馨提示

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

评论

0/150

提交评论