第7次课 第三章 Shell编程(研)(3)好文档.ppt_第1页
第7次课 第三章 Shell编程(研)(3)好文档.ppt_第2页
第7次课 第三章 Shell编程(研)(3)好文档.ppt_第3页
第7次课 第三章 Shell编程(研)(3)好文档.ppt_第4页
第7次课 第三章 Shell编程(研)(3)好文档.ppt_第5页
已阅读5页,还剩69页未读 继续免费阅读

下载本文档

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

文档简介

1、第三章 Shell编程,本章概要 什么是Shell脚本 正则表达式与grep命令 用Bash Shell编程,所有功能脚本必须有能力进行判断,也必须有能力基于一定条件处理相关命令。本小节讲述如何在脚本中创建和应用控制结构。 BASH 中几乎含有 C 语言中常用的所有控制结构,如条件分支、循环等,我们可以在脚本中创建和应用控制结构。,3.4.5 流程控制,退出状态,在书写正确脚本前,大概讲一下退出状态。 任何命令进行时都将返回一个退出状态。我们可以使用最后状态命令观察退出状态: $echo $? 主要有4种退出状态: (1)最后命令退出状态$? (2) 控制次序命令( then echo “Yo

2、ur EDITOR enviroment is not set” else echo “Using $EDITOR as the default editor” fi,grep输出检查,#!/bin/bash #grepif if grep Dave data.file /dev/null 2; condition2 )statments2;.* )default statments; esac,取值可以为变量或常数;取值后面必须为单词in,每个模式必须以右括号结束,匹配发现取值符合某一模式后,其间所有的命令开始执行直至;,如无一匹配模式,使用*捕获该值,执行缺省语句。,说明,取值将检测匹配的

3、每个模式。一旦模式匹配。则执行完匹配模式相应命令后不再继续执行其他模式; 模式部分可能包含元字符。,运用 case 结构进行分支执行的例子,#!/bin/bash echo Hit a key, then hit return.“ read Keypress case $Keypress ina-z ) echo Lowercase letter;A-Z ) echo Uppercase letter;0-9 ) echo Digit;* ) echo Punctuation, whitespace, or other; esac exit 0,循环,循环或跳转是一系列命令的重复执行过程。有三

4、种循环语句。 for 每次依次处理列表内的信息,直至循环耗尽; Until 此循环不常用,Until循环直到条件为真。条件在循环末尾部分; while 当条件为真时,循环执行,条件部分在循环头部。 控制语句的任何循环都可以嵌套使用。,for 循环,for 循环结构与 C 语言中有所不同,在 BASH 中 for 循环的基本结构是: for $var in listdostatmentsdone,如果do 和 for 被写在同一行,必须在 do 前面加上 “;”。如: for $var in list; do,变量在列表里依次取值,每取值一次,for循环即执行一次do和done之间所有的命令。,

5、in列表可选;如无in列表,for循环使用命令行的位置参数。in列表可以包括替换、字符串和文件名。,命令为任何有效的shell命令和语句。变量名为任何单词。,例1,#!/bin/bash for day in Sun Mon Tue Wed Thu Fri Satdoecho $daydone 在 for 所在那行的变量 day 是没有加 $ 符号的,而在循环体内,echo 所在行变量 $day 是必须加上 $ 符号的。,如果写成 for day 而没有后面的 in list 部分,则 day 将取遍命令行的所有参数。实际上指明: for param in “$” 或for param in

6、“$*” 如这个程序,例2: #!/bin/bash # forparam for paramdoecho “ you supplied $param as a command line option” done exit 0,运行结果,$./forparam myfile1 myfile2 myfile3 you supplied myfile1 as a command line option you supplied myfile2 as a command line option you supplied myfile3 as a command line option $,例3,对f

7、or循环使用ls命令:打印当前目录下所有文件。 #!/bin/bash #forls for loop in ls do echo $loop done,例4 使用for循环备份文件,#!/bin/bash #forcp BAK=”.bak” for loop in ls do echo “copying $loop to $loop$BAK” cp $loop $loop$BAK done $forcp copying array to array.bak copying arrows to arrows.bak copying center to center.bak .,until循环,

8、until循环执行一系列命令直到条件为真时停止。 until循环和while循环在处理方法上刚好相反。 until 循环的基本结构是: until condition is TRUE do statments done 条件可为任意测试条件。测试发生在循环末尾。因此循环至少执行一次。,例题,#!/bin/bash #until_who IS_ROOT=who | grep root until “IS_ROOT” do sleep 5 IS_ROOT=who | grep root done echo “watch it root in”|mail simon,while循环,while循环用

9、于不断执行一系列命令,也用于从输入文件中读取数据。其基本结构是: while statment dostatmentsdone 只有当命令的退出状态为0时,do和done之间的命令才被执行。如果退出状态不为0,则循环终止。命令执行完毕,控制回到循环的顶部,从头开始直至测试条件为假。,例1 基本的while循环,#!/bin/bash #whilecount COUNTER=0 #Does the counter=5? while $COUNTER -lt 5 do #add one to the COUNTER COUNTER=expr $COUNTER+1 echo $COUNTER don

10、e,脚本运行时: $whilecount 1 2 3 4 5,例2,用while循环从文件中读取数据。假定要从一个包含雇员名字、所属部门、ID号的一个文件中读取信息。 $cat names.txt Louise Conrad : Accounts : ACC8987 Peter James: Payroll : PR489 Fred Terms : Customer : CUS012 James Lenod : Accounts : ACC887 Frank Pavely : Payroll : PR489,#!/bin/bash #whileread while read LINE do e

11、cho $LINE done name.txt,用一个变量保存每行数据。当不再有读取数据时,条件为真,while使用输入重定向保证从文件中读取数据,使用break和continue控制循环,熟悉 C 语言编程的都很熟悉 break 语句和 continue 语句。 BASH 中同样有这两条语句,而且作用和用法也和 C 语言中相同。 break 语句可以让程序流程从当前循环体中完全跳出, 而 continue 语句可以跳过当次循环的剩余部分并直接进入下一次循环。,shell允许将一组命令集或语句形成一个可用块。这些块称为shell函数。其实就是给某一条或某一组命令取的名字。 函数由两部分组成:

12、函数标题函数名,要唯一 函数体函数内命令集合 函数的定义格式: function my_funcname code block,3.4.6 函数,函数用来实现模块化的程序,使程序更有效率。函数在当前shell环境中执行,即函数执行时并不派生一个子进程。 我们可以将函数保存在另外的文件中,需要使用的时候再将其载入自己的脚本。,函数的使用,BASH先要判断你给出的名字是别名、函数、内置命令,还是磁盘上的可执行程序。 函数必须先定义,后使用。 函数可以共享调用它的脚本中的变量。可以利用位置参数向函数传递参数。 如果在函数中使用exit命令将会退出整个脚本。如果只是从函数中退出,返回脚本调用函数的地方

13、,这时要使用return。 函数中的return语句,返回函数执行的最后一条命令的退出状态,或返回传给它的参数。,函数的使用规则,在脚本中定义函数,hello() echo “Hello there todays date is date” 所有函数必须在使用前定义。这意味着必须将函数放在脚本开始部分。调用函数仅使用其函数名即可。,在脚本中使用函数,#!/bin/bash #func1 hello() echo “Hello there todays date is date” echo “now going to the function hello” hello echo “back fr

14、om the function” $func1 now going to the function hello Hello there todays date is Sun Jun 8 10:46:59 GMT 2007 back from the function,向函数传递参数,BASH 中函数参数的定义并不需要在函数定义处就制定,而只需要在函数被调用时用 BASH 的位置变量 $1 $2 . 来引用就可以了。 #!/bin/bash #Scriptname: do_square square() let res = $1 * $1return $res square $1result=$

15、? #The variable “res” is not known here echo $result exit 0,运行脚本 $ do_square 5 25,从调用函数中返回,BASH 的返回值可以用 return 语句来指定返回一个特定的整数,如果没有 return 语句显式的返回一个返回值,则返回值就是该函数最后一条语句执行的结果(一般为 0,如果执行失败返回错误码)。函数的返回值在调用该函数的程序体中通过 $? 保留字来获得。 return 从函数中返回,用最后状态命令决定返回值。 return 0 无错误返回 return 1 有错误返回,在Shell中使用函数,可以搜索一些常用

16、的函数,把他们放到函数文件中并将文件载入shell。 文件头应包括语句#!/bin/bash,文件名可任意取。 一旦文件载入shell,就可以在命令行或脚本中调用函数,可以使用set命令查看所有定义的函数。输出表列包括已经载入shell的所有函数。,创建函数文件,#!/bin/bash #functions.main findit() if$# -lt 1; then echo “ usage: findit file” return 1 fi find / -name print ,定位文件,现在文件已经创建好了,要将之载入shell,键入: $. functions.main 使用“.”命

17、令,它不产生新的process,它会在原有的process下完成工作。 如果返回信息 file not found,再试: $. /functions.main 即,检查载入函数,使用set命令确定函数已经载入。set命令将在shell中显示所有载入函数。,执行shell函数,要执行函数,简单地键入函数名即可。例如: $findit groups /usr/bin/groups /usr/local/backups/groups.bak,函数调用,1.在脚本中调用函数 在脚本中调用函数,首先创建函数,并确保它位于调用之前。以下脚本中使用了两个函数。 2.从函数文件中调用函数 可以把函数放在函数

18、文件中。,在脚本中调用函数,#!/bin/bash is_it_a_directory() _DIRECTORY_NAME =$1 if $# -lt 1; then echo “is_it_a_directory: I need a directory name to check” return 1; fi if ! d $_DIRECTORY_NAME ; then return 1 else return 0 fi # 第一个函数,error_msg() echo e “007” echo $ echo e “007” return 0 # 第二个函数,echo n “Enter destination directory:” read DIREC if is_it_a_directory $DIREC then else “$DIREC does not exist .creating it now” mkdir $DIREC /dev/null 2command signal

温馨提示

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

评论

0/150

提交评论