Shell从入门到精通教学课件:第4章 条件测试和判断语句_第1页
Shell从入门到精通教学课件:第4章 条件测试和判断语句_第2页
Shell从入门到精通教学课件:第4章 条件测试和判断语句_第3页
Shell从入门到精通教学课件:第4章 条件测试和判断语句_第4页
Shell从入门到精通教学课件:第4章 条件测试和判断语句_第5页
已阅读5页,还剩73页未读 继续免费阅读

下载本文档

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

文档简介

第4章条件测试和判断语句本章主要涉及到的知识点有:条件测试:主要介绍Shell程序中的文件、变量、字符串数值以及逻辑等条件测试。条件判断语句:介绍基本的if、ifelse以及ifelif语句的使用方法。多条件判断语句case:主要介绍case语句的基本语法以及使用case语句来解决一些实际问题。运算符:主要介绍Shell中常用的运算符的使用方法,例如算术运算符、位运算符以及自增、自减运算符等。4.1条件测试为了能够正确处理Shell程序运行过程中遇到的各种情况,LinuxShell提供了一组测试运算符。通过这些运算符,Shell程序能够判断某种或者几个条件是否成立。条件测试在各种流程控制语句,例如判断语句和循环语句中发挥了重要的作用,所以,了解和掌握这些条件测试是非常重要的。4.1.1条件测试的基本语法在Shell程序中,用户可以使用测试语句来测试指定的条件表达式的条件的真或者假。当指定的条件为真时,整个条件测试的返回值为0;反之,如果指定的条件为假,则条件测试语句的返回值为非0值。条件测试的语法有2种,分别是test命令和[命令,test命令的语法如下:testexpression其中,参数expression表示需要进行测试的条件表达式,可以由字符串、整数、文件名以及各种运算符组成。例如,下面的表达式都是有效的条件表达式:1-eq2‘string’-z‘string’-efile[命令的语法如下:[expression]在上面的语法中,[是条件测试命令,参数expression是一个条件表达式。其中expression的语法与上面的test命令中的语法完全相同。条件表达式和左右方括号之间都必须有一个空格。4.1.2字符串测试

通常情况下,对于字符串的操作主要包括判断字符串变量是否为空以及两个字符串是否相等。在Shell中,用户可以通过5种运算符来对字符串进行操作。运算符说明string判断指定的字符串是否为空string1=string2判断2个字符串string1和string2是否相等string1!=string2判断2个字符串string1和string2是否不相等-nstring判断string是否是非空串-zstring判断string是否是空串#定义字符串变量[root@linuxchapter4]#a="abc"#使用test命令测试变量$a是否为空串[root@linuxchapter4]#test$a#通过echo命令和$?环境变量输出测试结果[root@linuxchapter4]#echo$?#输出结果为0,表示变量$a的值不为空0#使用-n运算符测试变量$a是否不为空[root@linuxchapter4]#test-n"$a"#输出测试结果[root@linuxchapter4]#echo$?#测试结果为0表示变量为非空字符串0#使用-z运算符测试变量$a是否为空串[root@linuxchapter4]#test-z"$a"#测试结果为1,表示变量$a不是空串[root@linuxchapter4]#echo$?1【例4-1】演示字符串测试的使用方法【例4-2】演示Shell中比较2个字符串值的方法#定义变量$a[root@linuxchapter4]#a="hello"#定义变量$b[root@linuxchapter4]#b="world"#比较2个字符串是否相等[root@linuxchapter4]#["$a"="$b"]#输出测试结果为1,表示$a和$b不相等[root@linuxchapter4]#echo$?1#测试$a和$b是否不相等[root@linuxchapter4]#test"$a"!="$b"#输出测试结果为0,表示$a和$b不相等[root@linuxchapter4]#echo$?0【例4-3】说明空格对于字符串比较结果的影响#定义字符串变量$a[root@linuxchapter4]#a="Helloworld."#定义字符串变量$b[root@linuxchapter4]#b="Helloworld."#测试$a和$b是否相等[root@linuxchapter4]#["$a"="$b"][root@linuxchapter4]#echo$?1【例4-4】演示字母大小写对于字符串比较结果的影响#变量$a的第1个字母为大写的H[root@linuxchapter4]#a="Helloworld."#变量$b的第1个字母为小写的h[root@linuxchapter4]#b="helloworld."[root@linuxchapter4]#["$a"="$b"]#变量$a和$b的值不相等[root@linuxchapter4]#echo$?14.1.3整数测试

与字符串测试类似,整数测试也有2种形式的语法:testnumber1opnumber2或者[number1opnumber2]其中,number1和number2分别表示参与比较的2个整数,可以是常量或者变量。op表示运算符。运算符说明number1-eqnumber2比较number1是否等于number2。如果相等,测试结果为0number1-nenumber2比较number1和number2是否不相等。如果number1和number2不相等,测试结果为0number1-gtnumber2比较number1是否大于number2。如果number1大于number2,测试结果为0number1-ltnumber2测试number1是否小于number2。如果number1小于number2,测试结果为0number1-genumber2测试number1是否大于等于number2。如果number1大于等于number2,测试结果为0number1-lenumber2测试number1是否小于等于number2。如果number1小于等于number2,测试结果为0【例4-5】比较2个整数是否相等[root@linuxchapter4]#[12-eq14][root@linuxchapter4]#echo$?041【例4-6】比较2个整数的大小[root@linuxchapter4]#test12-gt14[root@linuxchapter4]#echo$?1[root@linuxchapter4]#test12-lt14[root@linuxchapter4]#echo$?0【例4-7】比较变量与常数的大小[root@linuxchapter4]#x=365[root@linuxchapter4]#test"$x"-eq365[root@linuxchapter4]#echo$?060[root@linuxchapter4]#test"$x"-gt364[root@linuxchapter4]#echo$?100【例4-8】比较2个变量值的大小。在本例中,首先定义2个整数变量$x和$y,然后判断变量$x是否小于或者等于变量$y。[root@linuxchapter4]#x=123[root@linuxchapter4]#y=36[root@linuxchapter4]#["$x"-le"$y"][root@linuxchapter4]#echo$?081【例4-9】使用=比较两个整数会导致错误结果。[root@linuxchapter4]#[12=13][root@linuxchapter4]#echo$?1[root@linuxchapter4]#[12-eq13][root@linuxchapter4]#echo$?1【例4-10】使用针对整数的运算符来比较非整数会导致错误结果。[root@linuxchapter4]#x=12.3[root@linuxchapter4]#y=12[root@linuxchapter4]#["$x"-gt"$y"]-bash:[:12.3:integerexpressionexpected4.1.4文件测试

文件测试的语法如下:testopfile或者[opfile]在上面的语法中,op表示操作符,常用的操作符参见表4.3,其中file表示要测试的文件名。【例4-11】通过文件操作符来判断文件是否存在[root@linuxchapter4]#test-afile1[root@linuxchapter4]#echo$?0【例4-12】判断文件是否存在。[root@linuxchapter4]#[-afile3][root@linuxchapter4]#echo$?1【例4-13】通过操作符判断各种文件类型[root@linuxchapter4]#test-ddir1[root@linuxchapter4]#echo$?0[root@linuxchapter4]#test-ffile1[root@linuxchapter4]#echo$?080[root@linuxchapter4]#test-sfile2[root@linuxchapter4]#echo$?1[root@linuxchapter4]#test-bfile1[root@linuxchapter4]#echo$?1[root@linuxchapter4]#test-b/dev/sda[root@linuxchapter4]#echo$?0[root@linuxchapter4]#test-c/dev/tty[root@linuxchapter4]#echo$?0【例4-14】通过文件测试判断用户对文件的访问权限[root@linuxchapter4]#test-wfile1[root@linuxchapter4]#echo$?0[root@linuxchapter4]#test-rfile1[root@linuxchapter4]#echo$?0[root@linuxchapter4]#test-xfile1[root@linuxchapter4]#echo$?1[root@linuxchapter4]#test-xhello.sh[root@linuxchapter4]#echo$?0【例4-15】使用chmod命令为hello.sh文件设置setuid权限,这样的话执行该文件的用户就会临时用户该文件所有者的权限[root@linuxchapter4]#chmodu+shello.sh[root@linuxchapter4]#lltotal12drwxr-xr-x 2 root root 4096 Nov914:50 dir1-rw-r--r-- root root 12 Nov914:49 file1-rw-r--r-- 1 root root 0 Nov914:49 file2-rwsr-xr-x 1 root root 30 Nov915:06 hello.sh[root@linuxchapter4]#test-uhello.sh[root@linuxchapter4]#echo$?04.1.5逻辑操作符

Shell中的逻辑操作符可以将多个不同的条件组合起来,从而构成一个复杂的条件表达式。【例4-16】判断整数变量$a的值是否大于20,并且小于60。[root@linuxchapter4]#a=35[root@linuxchapter4]#test"$a"-gt20-a"$a"-lt60[root@linuxchapter4]#echo$?0【例4-17】通过条件测试来判断当前用户是否拥有某个文件的写入权限[root@linuxchapter4]#[-efile1-a-wfile1][root@linuxchapter4]#echo$?04.2条件判断语句

条件判断语句是一种最简单的流程控制语句。该语句使得程序根据不同的条件来执行不同的程序分支。本节将介绍Shell程序设计中的简单的条件判断语句。4.2.1使用简单的if语句进行条件判断

条件判断语句使用if语句来实现。最简单的if语句的语法如下:ifexpressionthen statement1 statement2 ...fi在上面的语法中,expression通常代表一个条件表达式,但是也可以是Shell命令。为了使得代码更加紧凑,在某些情况下,我们可以将if子句和then子句写在同一行中。此时,需要在expression表达式后面加上一个分号,如下:ifexpression;then statement1 statement2fi分号的作用是表示if子句已经结束,后面的代码是then子句。#!/bin/sh#使用条件测试判断/bin/bash是否是一个常规文件if[-f/bin/bash]thenecho"/bin/bashisafile"fi[root@linuxchapter4]#./ex4-18.sh/bin/bashisafile【例4-18】通过条件测试判断文件类型#!/bin/sh#通过echo命令和重定向创建一个文件echo"helloworld!">./msg.logif[-f./msg.log];thenecho"filehasbeencreated.";fi[root@linuxchapter4]#./ex4-19.shfilehasbeencrreated.【例4-19】通过条件测试判断文件是否创建成功#!/bin/sh#使用空命令作为条件if:;thenecho"alwaystrue";fi[root@linuxchapter4]#./ex4-20.shalwaytrue.【例4-20】使用空命令作为判断条件#!/bin/sh#使用&&操作符代替if语句test"$(whoami)"!="root"&&(echoyouareusinganon-privilegedaccount;exit1)而当我们切换到其他用户再执行该程序时,则会输出有关提示信息,如下:【例4-21】使用&&操作符代替if语句如果以root用户的身份执行【例4-21】,则没任何输出,如下:[root@linuxchapter4]#./ex4-21.sh[root@linuxchapter4]#su-chunxiao[chunxiao@linux~]$./ex4-21.shyouareusinganon-privilegedaccountifelse语句的基本语法如下:ifexpressionthen statement1 statement2 …else statement3 statement4 …fi在上面的语法中,expression表示if语句的执行条件,可以是条件表达式或者一个Shell命令。如果expression的值为真,则执行then子句中的语句statement1、statement2…。如果expression的值为假,则执行else子句中的语句,包括statement3、statement4、…,最后通过fi关键字结束整个if代码块。#!/bin/sh#输出提示信息echo"Pleaseenteranumber:"#从键盘读取用户输入的数字readnum#如果用户输入的数字大于10if["$num"-gt10];then #输出大于10的提示信息

echo"Thenumberisgreaterthan10."#否则else #输出小于或者等于10的提示信息

echo"Thenumberisequaltoorlessthan10."fi【例4-22】使用ifelse语句进行流程控制[root@linuxchapter4]#./ex4-22.shPleaseenteranumber:6Thenumberisequaltoorlessthan10.[root@linuxchapter4]#./ex4-22.shPleaseenteranumber:12Thenumberisgreaterthan10.#!/bin/sh.#输出提示信息echo"Pleaseenterascore:"#读取用户输入数据readscore#如果用户没有输入数据,则提示用户重新输入if[-z"$score"];thenecho"Youenternothing.Pleaseenterascore:"readscoreelse#如果用户输入的数据不对,则重新输入

if["$score"-lt0-o"$score"-gt100];thenecho"Thescoreshouldbebetween0and100.Pleaseenteragain:"readscoreelse#输出级别A 【例4-23】演示如何通过ifelse语句来根据学生的百分制成绩来输出五分制成绩if["$score"-ge90];thenecho"ThegradeisA."else#输出级别Bif["$score"-ge80];thenecho"ThegradeisB."else#输出级别Cif["$score"-ge70];thenecho"ThegradeisC."else#输出级别Dif["$score"-ge60];thenecho"ThegradeisD."else#输出级别Eecho"ThegradeisE."fififififi[root@linuxchapter4]#./ex4-23.shPleaseenterascore:12ThegradeisE.[root@linuxchapter4]#./ex4-23.shPleaseenterascore:98ThegradeisA.[root@linuxchapter4]#./ex4-23.shPleaseenterascore:77ThegradeisC.4.2.3使用ifelif语句进行多条件判断

ifexpression1thenstatement1statement2…elifexpression2thenstatement3statement4…elifexpression3thenstatement5statement6…elsestatementn..fiifelif语句的基本语法如下:在上面的语法中,expression1表示整个ifelfi语句结构中的第1个条件表达式,如果该条件表达式的值为真,则执行第1个then子句中的语句statement1以及statement2等等;否则,继续下面的判断。如果表达式expression2的值为真,则执行第2个then子句中的语句,以此类推。如果所有的条件表达式的值都为假,则执行最后的else子句中的语句。最后是ifelif结构的结束标志fi。#!/bin/shecho"Pleaseenterascore:"readscoreif[-z"$score"];thenecho"Youenternothing.Pleaseenterascore:"readscoreelseif["$score"-lt0-o"$score"-gt100];thenecho"Thescoreshouldbebetween0and100.Pleaseenteragain:"readscoreelse#如果成绩大于90if["$score"-ge90];thenecho"ThegradeisA."#如果成绩大于80且小于90【例4-24】本例对【例4-23】进行改进,使得该程序的可读性更强elif["$score"-ge80];thenecho"ThegradeisB."#如果成绩大于70且小于80elif["$score"-ge70];thenecho"ThegradeisC."#如果成绩大于60且小于70elif["$score"-ge60];thenecho"ThegradeisD."#如果成绩小于60elseecho"ThegradeisE."fififi4.2.4使用exit语句退出程序

exit语句的基本作用是终止Shell程序的执行。除此之外,exit语句还可以带一个可选的参数,用来指定程序退出时的状态码。exit语句的基本语法如下:exitstatus其中,status参数表示退出状态,该参数是一个整数值,其取值范围为0~255。与其他的Shell命令的一样,Shell程序的退出状态也储存在系统变量$?中,因此,用户可以通过该变量取得Shell程序返回给父进程的退出状态码。#!/bin/sh#使用echo语句输出字符串echohelloworld!#使用$?变量获取echo语句的执行状态echo$?#执行一个无效的命令aaa#输出执行状态echo$?#退出exit120【例4-25】演示在不同的情况下,程序返回不同的状态码[root@linuxchapter4]#./ex4-25.shhelloworld!0./ex4-25.sh:line11:aaa:commandnotfound127#!/bin/sh#如果文件已经存在,则直接退出if[-e"$1"]thenecho"file$1exists."exit1#如果文件不存在,则创建文件elsetouch"$1"echo"file$1hasbeencreated."exit0fi【例4-26】使用if和exit语句,使得程序在适当的时候退出[root@linuxchapter4]#./ex4-26.sh/bin/lsfile/bin/lsexists.[root@linuxchapter4]#echo$?1[root@linuxchapter4]#./ex4-26.sh./demo.txtfile./demo.txthasbeencreated.[root@linuxchapter4]#echo$?04.3多条件判断语句case

case语句的基本语法如下:casevariableinvalue1)statement1statement2...statementn;;value2)statement1statement2...statementn;;value3)statement1statement2...statementn;;...valuen)statement1statement2...statementn;;*)statement1statement2...statementn;;esac在上面的语法中,variable是一个变量,case语句会将该变量的值与每value1~valuen中的每个值相比较,如果与某个value的值相等,则执行该value所对应的一组语句。当遇到“;;”符号时,就跳出case语句,执行esac语句后面的语句。如果没有任何一个值与variable的值相匹配,则执行*后面的一组语句。4.3.2利用case语句处理选项参数

使用case语句来处理选项参数在Shell中非常普遍,尤其是/etc/init.d目录中服务脚本,几乎都含有一个或者多个case语句。4.3.3利用case语句处理用户输入

#!/bin/sh#输出提示信息echo"Hitakey,thenhitreturn."#读取用户按下的键readkeypress#case语句开始case"$keypress"in#小写字母

[[:lower:]])echo"Lowercaseletter.";;#大写字母

[[:upper:]])echo"Uppercaseletter.";;#单个数字

[0-9])echo"Digit.";;#其他字符*)echo"otherletter.";;esac【例4-27】说明case语句的使用方法[root@linuxchapter4]#./ex4-27.shHitakey,thenhitreturn.aLowercaseletter.[root@linuxchapter4]#./ex4-27.shHitakey,thenhitreturn.BUppercaseletter.[root@linuxchapter4]#./ex4-27.shHitakey,thenhitreturn.8Digit.[root@linuxchapter4]#./ex4-27.shHitakey,thenhitreturn.?otherletter.4.4运算符

本节将介绍算术运算符、位运算符以及自增/自减运算符等的使用方法。4.4.1算术运算符

与其他的程序设计语言一样,Shell中的算术运算符也主要包括加(+)、减(-)、乘(*)、除(/)、求余(%)以及幂运算(**)等。表4-4列出了常用的算术运算符以及使用方法。在LinuxShell中,用户可以通过4种方式来执行算术运算,这4种方式分别如下。1.使用expr外部程序expr是一个Shell命令,可以计算某个表达式的值,其基本语法如下:exprexpression其中,express是要计算的表达式。#!/bin/sh#计算2和100的差,即-98result=`expr2-100`echo"$result"#计算2和100的和,即102result=`expr2+100`echo"$result"#计算2和5的乘积,即10result=`expr2\*5`echo"$result"#计算24和8的商,即3result=`expr24/8`echo"$result"#先计算2和6的差,然后再乘以12,即-48result=`expr\(2-6\)\*12`echo"$result"#错误的语法result=`expr2+5`echo"$result"#错误的语法result=`expr2-4*9`echo"$result"#错误的语法result=`expr1-(4-7)`echo"$result"【例4-28】演示使用expr命令来计算不同的算术运算[root@linuxchapter4]#./ex4-28.sh-98102103-482+52-4*9./ex4-28.sh:commandsubstitution:line26:syntaxerrornearunexpectedtoken`('./ex4-28.sh:commandsubstitution:line26:`expr1-(4-7)'2.使用$((…))使用这种形式来进行算术运算写法比较自由,毋需对运算符和括号做转义处理,可以采用松散或者紧凑的格式来书写表达式。#!/bin/sh#紧凑格式,计算3和6的和result=$((3+6))echo"$result"#松散格式,计算3和9的和result=$((3+9))echo"$result"#计算3和6的乘积reuslt=$((3*6))echo"$result"#计算7和5的商result=$((7/5))echo"$result"#计算8和3的余数result=$((8%3))echo"$result"#复合运算result=$(((1-4)*5))echo"$result"【例4-29】演示如何使用$((..))符号进行算术运算[root@linuxchapter4]#./ex4-29.sh9121212-153.使用$[…]#!/bin/sh#加法运算result=$[4+5]echo"$result"#复合运算result=$[(1+2)*3]echo"$result"#幂运算result=$[2**4]echo"$result"[root@linuxchapter4]#./ex4-30.sh9916【例4-30】演示如何使用方括号来进行算术运算4.使用let命令

使用let命令可以执行一个或者多个算术表达式,其中的变量名毋需使用$符号。如果表达式中含有空格或者其他特殊字符,则必须将其引用起来。#!/bin/sh#定义变量n=10#加法运算letn=n+1echo"$n"#乘法运算letn=n*10echo"$n"#幂运算letn=n**2echo"$n"[root@linuxchapter4]#./ex4-31.sh1111012100【例4-31】演示使用let命令来执行算术运算复合算术运算符4.4.2位运算符

位运算通常出现在整数间,它针对的不是整个整数,而是其二进制表示形式中的某个或者某些位(bit)。例如,2>>1

温馨提示

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

评论

0/150

提交评论