第5章shell编程(二)课件

上传人:无*** 文档编号:241613123 上传时间:2024-07-09 格式:PPT 页数:55 大小:318KB
返回 下载 相关 举报
第5章shell编程(二)课件_第1页
第1页 / 共55页
第5章shell编程(二)课件_第2页
第2页 / 共55页
第5章shell编程(二)课件_第3页
第3页 / 共55页
点击查看更多>>
资源描述
操作系统Operating SystemE-mail:第第5章章 shell编程编程ShellShell的特殊字符的特殊字符第一个第一个shellshell程序程序ShellShell变量与运算符变量与运算符ShellShell的控制结构的控制结构ShellShell函数函数交互式交互式shellshellShellShell脚本调试脚本调试第一个第一个shell程序程序1创建文件创建文件2设置可执行权限设置可执行权限3执行执行Shell程序程序Shell的特殊字符的特殊字符1 1美元符号美元符号2 2双引号(双引号(“)3 3单引号(单引号()4 4倒引号(倒引号()5 5反斜线(反斜线()6 6花括号花括号7.7.输入重定向输入重定向 9.9.输出附加重定向输出附加重定向1010即时文件定向即时文件定向1111管道线管道线1212通配符通配符13命令执行操作符命令执行操作符Shell变量与运算符变量与运算符系统变量系统变量环境变量环境变量用户变量用户变量Shell控制结构条件测试条件测试分支结构:分支结构:if,case,select循环结构:循环结构:for结构,结构,while结构结构4.9.2 条件测试条件测试是用来判断一个条件的条件测试是用来判断一个条件的true或或false条件测试有条件测试有2种常用形式:种常用形式:一种是用一种是用test 命令。命令。另一种是用一对方括号将测试条件括起来。另一种是用一对方括号将测试条件括起来。这两种形式是完全等价的。这两种形式是完全等价的。例如,测试位置参数例如,测试位置参数$1是否是已存在的普通文件,可写为:是否是已存在的普通文件,可写为:test -f$1也完全可写成:也完全可写成:-f$1 注意注意这这里的空格很重要,要确保里的空格很重要,要确保方括号前后的空格方括号前后的空格test命令可以和多种系统运算符一起使用。这些运算符可以命令可以和多种系统运算符一起使用。这些运算符可以分为四类:文件测试运算符、字符串测试运算符、数值测分为四类:文件测试运算符、字符串测试运算符、数值测试运算符和逻辑运算符。试运算符和逻辑运算符。条件测试条件测试1有关文件方面的测试有关文件方面的测试 参参 数数 功功 能能-r 文件名文件名 若文件存在并且是用户可读的,则测试条件为真若文件存在并且是用户可读的,则测试条件为真-w 文件名文件名 若文件存在并且是用户可写的,则测试条件为真若文件存在并且是用户可写的,则测试条件为真-x 文件名文件名 若文件存在并且是用户可执行的,则测试条件为真若文件存在并且是用户可执行的,则测试条件为真-f 文件名文件名 若文件存在并且是普通文件,则测试条件为真若文件存在并且是普通文件,则测试条件为真-d 文件名文件名 若文件存在并且是目录文件,则测试条件为真若文件存在并且是目录文件,则测试条件为真-p 文件名文件名 若文件存在并且是命名的若文件存在并且是命名的FIFO文件,则测试条件为真文件,则测试条件为真-b 文件名文件名 若文件存在并且是块设备文件,则测试条件为真若文件存在并且是块设备文件,则测试条件为真-c 文件名文件名 若文件存在并且是字符设备文件,则测试条件为真若文件存在并且是字符设备文件,则测试条件为真-s 文件名文件名 若文件存在并且文件的长度大于若文件存在并且文件的长度大于0,则测试条件为真,则测试条件为真-t 文件描述字文件描述字 若文件被打开且其文件描述字是与终端设备相关的,若文件被打开且其文件描述字是与终端设备相关的,则测试条件为真。默认的则测试条件为真。默认的“文件描述字文件描述字”是是1 2有关字符串方面的测试有关字符串方面的测试 参参 数数 功功 能能 -z s1如果字符串如果字符串s1的长度为的长度为0,则测试条件为真。,则测试条件为真。-n s1如果字符串如果字符串s1的长度大于的长度大于0,则测试条件为真。,则测试条件为真。s1如果字符串如果字符串s1不是空字符串,则测试条件为真。不是空字符串,则测试条件为真。s1 =s2如果如果s1等于等于s2,则测试条件为真。在,则测试条件为真。在“”前后应有空前后应有空格。格。s1!=s2如果如果s1不等于不等于s2,则测试条件为真。,则测试条件为真。s1 s2如果按字典顺序如果按字典顺序s1在在s2之后,则测试条件为真之后,则测试条件为真3有关数值方面的测试有关数值方面的测试 参参 数数 功功 能能 n1-eq n2如果整数如果整数n1等于等于n2,则测试条件为真,则测试条件为真 n1-ne n2 如果整数如果整数n1不等于不等于n2,则测试条件为真,则测试条件为真 n1-lt n2 如果如果n1小于小于n2,则测试条件为真,则测试条件为真 n1-le n2如果如果n1小于或等于小于或等于n2,则测试条件为真,则测试条件为真 n1-gt n2如果如果n1大于大于n2,则测试条件为真,则测试条件为真 n1-ge n2如果如果n1大于或等于大于或等于n2,则测试条件为真,则测试条件为真4逻辑运算符逻辑运算符 上上述述测测试试条条件件可可以以在在if 语语句句或或循循环环语语句句中中单单个个使使用用,也也可可以以通通过过逻逻辑辑运运算算符符把它们组合起来使用。可以在测试语句中使用的逻辑运算符有:把它们组合起来使用。可以在测试语句中使用的逻辑运算符有:!逻辑非逻辑非(NOT),它放在任意逻辑表达式之前,使原来为真的表达式变为,它放在任意逻辑表达式之前,使原来为真的表达式变为假,使原来为假的变为真。例如,假,使原来为假的变为真。例如,!-r “$1”,!test -r “$1”等。等。/文件方面的测试文件方面的测试-a 逻辑与逻辑与(AND),它放在两个逻辑表达式中间,仅当两个表达式都为真时,它放在两个逻辑表达式中间,仅当两个表达式都为真时,结果才为真。例如,结果才为真。例如,-f “$myfile”-a -r “myfile”/文件方面的测试文件方面的测试 -o 逻辑或逻辑或(OR),它放在两个逻辑表达式中间,其中只要有一个表达式,它放在两个逻辑表达式中间,其中只要有一个表达式为真,结果就为真。例如,为真,结果就为真。例如,“$a”-ge 0 -o “$b”-le 100 /数值方面的测试数值方面的测试 (表达式表达式)圆括号,它可以把一个逻辑表达式括起来,使之成为一个整体,圆括号,它可以把一个逻辑表达式括起来,使之成为一个整体,优先得到运算。例如,优先得到运算。例如,!(“$a”-ge 0)-a !($b -le 100)逻辑表达式中的条件测试运算符优先级高于逻辑表达式中的条件测试运算符优先级高于“!”运算符,运算符,“!”运算符的优先级运算符的优先级高于高于“-a”运算符,运算符,“-a”运算符高于运算符高于“-o”,而且圆括号,而且圆括号()高于高于“-a”5特殊条件测试特殊条件测试(1):表示不做任何事情,其退出值为:表示不做任何事情,其退出值为0。(2)true 表示总为真,其退出值总是表示总为真,其退出值总是0。(3)false 表示总为假,其退出值是表示总为假,其退出值是255。条件测试字符串查找例子#!/bin/bash#test.shif$#-ne 2 ;then/如果用户输入参数不等于如果用户输入参数不等于2echo Usage:$0 string file;exit 1;figrep$1$2;if$?-ne 0 ;then/判断前一个命令(判断前一个命令(grep)是否成功返回,)是否成功返回,如果没有成功显示没找到相关信息,否则显示找到了。如果没有成功显示没找到相关信息,否则显示找到了。echo Not Found$1 in$2;exit 1;fiecho Found$1 in$2;rootUbuntu:#test.sh usage test.sh Not Found usage in test.shrootUbuntu:#test.sh Usage test.sh Found Usage in test.shrootUbuntu:#test.sh Usage Usage:1 string file分支结构分支结构if语句语句 if语句是用来表示判断的最常用的一条语句是用来表示判断的最常用的一条语句。其语法结构分为语句。其语法结构分为2种,如下所示。种,如下所示。1if结构结构 if结构的格式如下:结构的格式如下:if expressionthen EXPRESSIONSfi2if/else结构结构 if/else结构的格式如下所示:结构的格式如下所示:if expressionthen EXPRESSIONSelse EXPRESSIONSfi3 3if/elseif/else结构例子结构例子 大多数情况下,可以使用大多数情况下,可以使用测试测试命令来命令来对对条件条件进进行行测试测试,比如可以比比如可以比较较字符串、判断文件是否存在及是否可字符串、判断文件是否存在及是否可读读等等等等 -f somefile :判断是否是一个文件:判断是否是一个文件 -x/bin/ls :判断:判断/bin/ls是否存在并有可是否存在并有可执执行行权权限限 -n$var :判断:判断$var变变量是否有量是否有值值$a=$b :判断:判断$a和和$b是否相等是否相等#!/bin/shif$SHELL=/bin/bash;then echo your login shell is the bash(bourne again shell)else echo your login shell is not bash but$SHELLfi环境环境变变量量$SHELL包含有登包含有登录录shell的名称,拿它和的名称,拿它和/bin/bash进进行比行比较较以判断当前使用的以判断当前使用的shell是否是否为为bash。分支结构分支结构case语句语句 除了除了if语句外,语句外,case语句也是一个重要语句也是一个重要的分支语句。其含义和的分支语句。其含义和C语言中的语言中的switch语语句相似。句相似。case语句的格式如下所示:语句的格式如下所示:case word in condition1)EXPRESSIONS ;condition2)EXPRESSIONS ;.*)EXPRESSIONS ;esaccase例子利用利用case写了一个名为写了一个名为smartzip的脚本,该脚本可以自动解压的脚本,该脚本可以自动解压bzip2,gzip和和zip 类型的压缩文件:类型的压缩文件:#!/bin/sh ftype=file“$1”#由倒引号括起来的字符串被由倒引号括起来的字符串被Shell解释为命令行解释为命令行case$ftype in$1:Zip archive*)unzip$1;$1:gzip compressed*)gunzip$1;$1:bzip2 compressed*)bunzip2$1;*)echo File$1 can not be uncompressed with smartzip;esac使用了一个特殊变量使用了一个特殊变量$1,该变量包含有传递给该脚本的第一个参数值。也,该变量包含有传递给该脚本的第一个参数值。也就是说,当我们运行:就是说,当我们运行:smartzip articles.zip$1 就是字符串就是字符串 articles.zip。file命令可以辨别出一个给定文件的文件类型,命令可以辨别出一个给定文件的文件类型,如:,其输出结果为:如:,其输出结果为:lf.gz:gzip compressed data,deflated,original,last modified:Mon Aug 27 23:09:18 2001,os:Unixselect 语句select擅长于擅长于交互式交互式场合。用户可以从一组不同的场合。用户可以从一组不同的值中进行选择:值中进行选择:select var in.;dobreak;done下面是一个简单的示例:下面是一个简单的示例:select例子#!/bin/shecho What is your favourite OS?select var in Linux Gnu Hurd Free BSD Other;dobreak;doneecho You have selected$var该脚本的运行结果如下:该脚本的运行结果如下:What is your favourite OS?1)Linux2)Gnu Hurd3)Free BSD4)Other#?1You have selected Linux所以从该例中可以看出,所以从该例中可以看出,select适合用于菜单的设计适合用于菜单的设计循环结构循环结构for语句语句 for语句是常用的循环语句,其格式如语句是常用的循环语句,其格式如下所示:下所示:for NAME in LIST;do EXPRESSIONS;donefor语句例子下面的示例会把下面的示例会把A B C分别打印到屏幕上:分别打印到屏幕上:#!/bin/shfor var in A B C;do echo var is$var“done下面是一个脚本下面是一个脚本showrpm,其功能是打印一些,其功能是打印一些RPM包的统计信息:包的统计信息:#!/bin/sh#:showrpmfor rpmpackage in$*;do if -r$rpmpackage;then echo=$rpmpackage=rpm-qi-p$rpmpackage else echo ERROR:cannot read file$rpmpackage fidone这里出现了第二个特殊变量这里出现了第二个特殊变量$*,该变量包含有输入的所有命令行参数,该变量包含有输入的所有命令行参数值。如果你运行值。如果你运行showrpm openssh.rpm w3m.rpm webgrep.rpm,那么,那么$*就包含有就包含有 3 个字符串,即个字符串,即openssh.rpm,w3m.rpm和和 webgrep.rpm。rootUbuntu:#showrpm/cdrom/RedHat/RPMS/*.rpm程序执行:通过循环依次判断以命令参数形式输入的包文件程序执行:通过循环依次判断以命令参数形式输入的包文件/cdrom/RedHat/RPMS/*.rpm是否存在并且可读,如果是,输出是否存在并且可读,如果是,输出=$rpmpackage=,并且安装,并且安装该包,否则显示错误信息该包,否则显示错误信息 Another example:is abc#!/bin/bashif test$#=0;/判断命令行参数的个数判断命令行参数的个数then ls else for i do ls -l$i|grep d/匹配所有以匹配所有以d开始的行开始的行 donefi rootUbuntu:#abc 如果输入没有参数,则显示当前目录下如果输入没有参数,则显示当前目录下的文件。否则,以长格式显示每个目录下的文件。的文件。否则,以长格式显示每个目录下的文件。其语法格式如下所示:其语法格式如下所示:/while循环循环while CONTROL-COMMAND;do EXPRESSIONS;done循环结构循环结构while语句语句While循环例子#!/bin/sh help()cat shift by 2 -)shift;break;#end of options -*)echo error:no such option$1.-h for help;exit 1;*)break;esacdone echo opt_f is$opt_fecho opt_l is$opt_lecho first arg is$1echo 2nd arg is$2 rootUbuntu:#cmdparser-l hello-f -somefile1 somefile2返回结果如下:返回结果如下:opt_f is 1opt_l is hellofirst arg is-somefile12nd arg is somefile2break、continue和和exit语句语句 break语句的作用是在正常结束之前退语句的作用是在正常结束之前退出出当前当前循环。循环。continue语句的作用是不执行语句的作用是不执行本次本次循循环,直接跳到环,直接跳到下一次下一次循环。循环。exit语句用于语句用于中止中止脚本程序并返回值。脚本程序并返回值。Shell函数Shell函数函数 Shell里也可以使用函数。里也可以使用函数。Shell函数的函数的名字必须是唯一的,且符合变量命名规则。名字必须是唯一的,且符合变量命名规则。所有用来组织函数的命令就像普通命令一所有用来组织函数的命令就像普通命令一样执行。当以一个简单的命令名来调用函样执行。当以一个简单的命令名来调用函数的时候,和该函数相关的命令就被执行。数的时候,和该函数相关的命令就被执行。声明声明Shell函数函数 函数在必须声明,然后才能在函数在必须声明,然后才能在Shell里里执行。自定义函数可以采用如下所示两种执行。自定义函数可以采用如下所示两种方法声明。方法声明。/方法一方法一function FUNCTION_NAME EXPRESSIONS/方法二方法二FUNCTION_NAME()EXPRESSIONS调用调用Shell函数函数 Shell函数的调用也和函数的调用也和C语言中调用函语言中调用函数的方法有所区别。其参数是直接跟在函数的方法有所区别。其参数是直接跟在函数名后,而无须通过括号括起来,如下所数名后,而无须通过括号括起来,如下所示:示:FUNCTION_NAME PARAM1 PARAM2.函数例子下面是一个名为下面是一个名为xtitlebar的脚本,它可以改变终端窗口的名称。这里使用了一个的脚本,它可以改变终端窗口的名称。这里使用了一个名为名为help的函数,该函数在脚本中使用了两次:的函数,该函数在脚本中使用了两次:#!/bin/sh#vim:set sw=4 ts=4 et:help()cat /tmp/ttt&sleep 2echo Login Incorrect.Re-enter,Please.stty cookedShell脚本调试Shell脚本调试编写编写shell脚本通常从小的脚本开始,逐步过脚本通常从小的脚本开始,逐步过渡到中等长度的程序,不断积累经验,以渡到中等长度的程序,不断积累经验,以便实现大程序的编写,为此,统称采用自便实现大程序的编写,为此,统称采用自底向上的方法,也就是:底向上的方法,也就是:先搞清楚脚本要干什么;先搞清楚脚本要干什么;然后将过程的连续阶段分解为独立的步骤;然后将过程的连续阶段分解为独立的步骤;最后利用最后利用shell提示符,交互的检查和调试每提示符,交互的检查和调试每个独立的步骤个独立的步骤shell脚本调试编写的脚本无法执行的原因除脚本文件缺少编写的脚本无法执行的原因除脚本文件缺少“执行执行”权限权限外,有两种可能:外,有两种可能:执行脚本的环境设置不对执行脚本的环境设置不对脚本本身有错误脚本本身有错误。解决方法之一:解决环境设置问题 不能直接在其他不能直接在其他shell下运行下运行bash脚本,解决的脚本,解决的办法是在脚本的第一行写上:办法是在脚本的第一行写上:#!/bin/bash 在在PATH环境变量中没有包括环境变量中没有包括“.”(当前工作目录)(当前工作目录)。解决办法是设置解决办法是设置PATH:PATH=$PATH:.脚本文件与已存在命令的名字相同。脚本文件与已存在命令的名字相同。解决方法之二:解决脚本错误基本的错误类型有两种:语法错误和逻辑错误。基本的错误类型有两种:语法错误和逻辑错误。语法错误是编写程序时违反了所用编程语言的规则语法错误是编写程序时违反了所用编程语言的规则而造成的。而造成的。这类错误包括:格式不对,单词拼错,括号,引号这类错误包括:格式不对,单词拼错,括号,引号不成对等等。不成对等等。该类错误比较容易修改。当出现该类错误时,可以该类错误比较容易修改。当出现该类错误时,可以根据根据bash的错误提示(第几行,出现什么错误),的错误提示(第几行,出现什么错误),修改代码,排除错误。修改代码,排除错误。解决方法之二:解决脚本错误逻辑错误通常是由于程序的逻辑关系存在问题,比如逻辑错误通常是由于程序的逻辑关系存在问题,比如本该小于等于运算符使用了小于运算符。对此类问本该小于等于运算符使用了小于运算符。对此类问题需要进行程序调试。题需要进行程序调试。正常情况下,对一个大程序来说,程序员在调试上花正常情况下,对一个大程序来说,程序员在调试上花的时间往往比首次写代码的时间还多。的时间往往比首次写代码的时间还多。一个很有用的技巧是使用一个很有用的技巧是使用setset命令打开命令打开-x-x选项,或者选项,或者在启动在启动shellshell时使用时使用-x-x选项将选项将shellshell设置成跟踪模式。设置成跟踪模式。另一个有用的技巧是在程序中经常使用另一个有用的技巧是在程序中经常使用echoecho或或printprint命令,以显示脚本当前执行到什么地方。命令,以显示脚本当前执行到什么地方。Shell编程综合例子之一文件重命名在该例子中,可以对多个文件进行重命名,并且使用及时文件定在该例子中,可以对多个文件进行重命名,并且使用及时文件定向打印帮助:向打印帮助:#!/bin/sh#we have less than 3 arguments.Print the help text:if$#-lt 3 ;then/cat HELPren-renames a number of files using sed regular expressions USAGE:ren regexp replacement files.EXAMPLE:rename all*.HTM files in*.html:ren HTM$html*.HTMHELP exit 0fi第一个第一个if表达式判断输入命令行参数是否小于表达式判断输入命令行参数是否小于3个个(特殊变量特殊变量$#表示包含参数的个数表示包含参数的个数)。如果输入参数小于。如果输入参数小于3个,则将帮助文个,则将帮助文字传递给字传递给cat命令,然后由命令,然后由cat命令将其打印在屏幕上。打印帮命令将其打印在屏幕上。打印帮助文字后程序退出助文字后程序退出Shell编程综合例子OLD=$1NEW=$2#The shift command removes one argument from the list of#command line arguments.Shift/shift命令每执行一次,变量的个数命令每执行一次,变量的个数($#)减一,而变量值提减一,而变量值提前一位前一位 Shift如果输入参数等于或大于如果输入参数等于或大于3个,就将第一个参数赋值给变量个,就将第一个参数赋值给变量OLD,第二个参数赋值给变量,第二个参数赋值给变量NEW。下一步,使用。下一步,使用shift命令将第命令将第一个和第二个参数从参数列表中删除,这样原来的第三个参一个和第二个参数从参数列表中删除,这样原来的第三个参数就成为参数列表数就成为参数列表$*的第一个参数。的第一个参数。#$*contains now all the files:for$*;do if -f$file ;then newfile=echo$file|sed s/$OLD/$NEW/g if -f$newfile;then echo ERROR:$new already else echo renaming$newfile.mv$file$newfile fi fiDone然后开始循环,命令行参数列表被一个接一个地被赋值给变然后开始循环,命令行参数列表被一个接一个地被赋值给变量量$file。接着判断该文件是否存在,如果存在则通过。接着判断该文件是否存在,如果存在则通过sed命令搜索和替换来产生新的文件名。然后将反短斜线内命命令搜索和替换来产生新的文件名。然后将反短斜线内命令结果赋值给令结果赋值给newfile。这样就达到了目的:得到了旧文。这样就达到了目的:得到了旧文件名和新文件名。然后使用件名和新文件名。然后使用 mv命令进行重命名命令进行重命名 Shell编程综合例子之二文件循环拷贝实际需求:将所有发出邮件保存到一个文件中。实际需求:将所有发出邮件保存到一个文件中。但是过了几个月之后,这个文件可能会变得很但是过了几个月之后,这个文件可能会变得很大以至于该文件的访问速度变慢;大以至于该文件的访问速度变慢;脚本脚本 rotatefile 可以解决这个问题。这个脚本可可以解决这个问题。这个脚本可以重命名邮件保存文件(假设为以重命名邮件保存文件(假设为outmail)为)为outmail.1,而原来的,而原来的outmail.1就变成了就变成了 outmail.2 等等等等.#!/bin/sh#vim:set sw=4 ts=4 et:ver=0.1help()cat HELP rotate rotate the USAGE:rotatefile-h OPTIONS:-h help text EXAMPLE:rotate This will e.g rename out.2 to out.3,out.1 to out.2,out to out.1BR and create an empty out-file The max number is 10 version$ver HELP exit 0 error()echo$1 exit 1 p经常不断地学习,你就什么都知道。你知道得越多,你就越有力量pStudyConstantly,AndYouWillKnowEverything.TheMoreYouKnow,TheMorePowerfulYouWillBe写在最后感谢聆听不足之处请大家批评指导Please Criticize And Guide The Shortcomings结束语讲师:XXXXXX XX年XX月XX日
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 管理文书 > 施工组织


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!