shell4-循环语句、函数_第1页
shell4-循环语句、函数_第2页
shell4-循环语句、函数_第3页
shell4-循环语句、函数_第4页
shell4-循环语句、函数_第5页
已阅读5页,还剩40页未读 继续免费阅读

下载本文档

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

文档简介

Shell脚本编程第4章循环语句和函数逻辑结构定义清晰脚本可以重用多加入注释学会调试脚本echo配合exit命令或sleep命令bash-x脚本编写一个好脚本的要素3while语句、shift命令until语句、case语句shell函数应用知识要点4重复测试某个条件,只要条件成立则反复执行while语句的结构while

条件测试操作do

命令序列donewhile

未猜中正确价格do

反复猜测商品价格donewhile条件测试操作done结束循环do命令序列…条件成立条件不成立5while语句的各种用法6while语句的结构i=1while((i<=10))doecho$i((i++))donewhilereadusergroupshomedirdo echo$groupsdone<file1无限循环的写法while:whiletruewhile[1]while:do

read-p"input:"str

if[["$str"="end"]]

then

break fidonei=1while((i<=$#))doecho${!i}((i++))donecat/etc/passwd|whilereadlinedoecho"selectis:$line"done每5分钟输出一次时间到/tmp/time.txt禁止使用计划任务While语句应用示例#!/bin/bashwhiletruedodate+%H%M>>/tmp/time.txtsleep300done死循环7批量添加用户用户名称以stu开头,按数字顺序进行编号一共添加20个用户,即stu1、stu2、……、stu20初始密码均设为123456While语句应用示例[root@localhost~]#catuaddwhile.sh#!/bin/bashPREFIX="stu"i=1while

(($i<=20))douseradd${PREFIX}$iecho"123456"|passwd--stdin${PREFIX}$i&>/dev/null

((i++))done序号递增,避免死循环循环条件:序号<=20[root@localhost~]#./uaddwhile.sh[root@localhost~]#grep"stu"/etc/passwd|tail-3stu18:x:1028:1028::/home/stu18:/bin/bashstu19:x:1029:1029::/home/stu19:/bin/bashstu20:x:1030:1030::/home/stu20:/bin/bash8使用inotify-tools,实现自动同步备份While语句应用示例[root@localhost~]#cat/opt/rsync.shinotifywait-mrq-emodify,create,move,delete/bak/|whilereadDIREVENTFILEdorsync-az--delete/bak/rsync:///share&>/dev/nulldone9[root@localhost~]#inotifywait-mrq-emodify,create,move,delete/bak//bak/CREATEpasswd/bak/MODIFYpasswd/bak/DELETEpasswd分析当前主机中所有用户,哪些是普通用户,哪些是系统用户While语句应用示例10#!/bin/bashcat/etc/passwd|cut-d:-f1,3|tr:''>file1whilereaduseruiddoif((uid>=500&&uid<=600))thenecho"$user是普通用户"elseecho"$user是系统用户"fidone<file1猜商品价格游戏通过变量RANDOM获得随机数提示用户猜测并记录次数,猜中后退出循环While语句应用示例#!/bin/bashPRICE=$(expr$RANDOM%1000)TIMES=0echo"商品实际价格为0-1000之间,猜猜看是多少?"whiletruedoread-p"请输入你猜测的价格数目:"INTletTIMES++if[$INT-eq$PRICE];thenecho"恭喜你答对了,实际价格是$PRICE"echo"你总共猜测了$TIMES次"exit0elif[$INT-gt$PRICE];thenecho"太高了!"elseecho"太低了!"fidone与实际价格比较,给出提示循环条件:ture若猜中则退出脚本提示猜测并记录次数[root@localhost~]#./pricegame.sh商品实际价格为0-999之间,猜猜看是多少?请输入你猜测的价格数目:500太高了!请输入你猜测的价格数目:250太低了!请输入你猜测的价格数目:375太高了!请输入你猜测的价格数目:280太高了!请输入你猜测的价格数目:265太高了!请输入你猜测的价格数目:253恭喜你答对了,实际价格是253你总共猜测了6次11编写脚本生成2位的随机数,要求个位和十位数不能相同,如果遇到个位和十位相同的就退出脚本(注意十位数不能为0)实验案例112[root@localhost~]#exp161578151516531连续成功7次[root@localhost~]#exp1连续成功0次[root@localhosttest4]#exp123连续成功1次[root@localhosttest4]#exp185467497连续成功4次给登录到当前主机的所有非root用户终端发送一句话“用户名:Hi,I’mRoot!”实验案例213[root@localhost~]#vihello.sh#!/bin/bashwho|grep-v^root|tr-s''|cut-d''-f1,2>file1whilereaduser

ttydoecho"$user:Hi,I'mRoot!">/dev/$ttydone<file1根据前面猜价格的脚本,编写猜10以内的随机数的脚本,显示效果如下每个人只有3次机会,超过3次没有猜中自动退出实验案例314“大家猜猜0-9的随机数,你一共有3次机会”请输入一个0-9的数字:4太高啦,你还有2次机会请输入一个0-9的数字:8太高啦,你还有1次机会请输入一个0-9的数字:9太高啦,你猜了3次没机会了“大家猜猜0-9的随机数,你一共有3次机会”请输入一个0-9的数字:4太低啦,你还有2次机会请输入一个0-9的数字:7你答对了就是:7,你一共猜了2次“大家猜猜0-9的随机数,你一共有3次机会”请输入一个0-9的数字:5太高啦,你还有2次机会请输入一个0-9的数字:1太高啦,你还有1次机会请输入一个0-9的数字:0你答对了就是:0,你一共猜了3次编写del.sh脚本实现批量删除用户,脚本要求如下(使用while循环读取来改写上次的for脚本)提示输入需要删除的用户名前缀,如果用户名前缀为空或者空格,就显示“请输入合法用户名前缀”,然后退出脚本,每删除一个用户,要显示“用户用户名

已经成功被删除”。如果没有可以删除的用户,就显示“以用户前缀开头的用户不存在”。最后要显示删除的用户总数是“一共新建的用户数:数目”注意不能删除管理员或者系统用户(UID小500或者大于60000)15实验案例4[root@servera~]#add.sh请输入用户名的前缀:rr请输入用户的数目:2用户rr1已经创建成功用户rr2已经创建成功一共创建的用户数:2个[root@servera~]#del.sh请输入需要删除的用户名前缀:请输入合法的用户名前缀[root@servera~]#del.sh请输入需要删除的用户名前缀:rroot是系统用户不能删除rpc是系统用户不能删除rtkit是系统用户不能删除rpcuser是系统用户不能删除用户rr1已经被成功删除用户rr2已经被成功删除一共删除的用户数:2个[root@servera~]#del.sh请输入需要删除的用户名前缀:rr以rr开头的用户不存在16shift迁移语句用于迁移位置变量,将$1~$9依次向左传递例如,若当前脚本程序获得的位置变量如下:

$1=file1、$2=file2、$3=file3、$4=file4则执行一次shift命令后,各位置变量为:

$1=file2、$2=file3、$3=file4再次执行shift命令后,各位置变量为:

$1=file3、$2=file417shift迁移语句应用示例:通过命令行参数传递多个整数值,并计算总和[root@localhost~]#vitest.sh#!/bin/bashn=1while(($#>0))doecho\$$nis$1&&((n++))shiftdone18shift迁移语句应用示例:通过命令行参数传递多个整数值,并计算总和[root@localhost~]#vishowday.sh#!/bin/bashResult=0while(($#>0))doResult=$((Result+$1))

shiftdoneecho"Thesumis:$Result“[root@localhost~]#./sumer.sh123456Thesumis:102验证脚本执行结果foriin`seq$#`doecho$@shiftdone这又会是什么结果19until循环语句until语句根据条件执行重复操作until

条件测试命令do

命令序列doneuntil条件测试命令条件为假条件为真done结束循环do命令序列…提示输入用户名,如果直接回车或者空格,会继续提示输入用户名。until语句应用示例#!/bin/bashread-p"pleaseinputyourname:"namewhile[[

-z"$name"]]doread-p"pleaseinputyourname:"namedone20#!/bin/bashread-p"pleaseinputyourname:"nameuntil![[-z"$name"]]doread-p"pleaseinputyourname:"namedone编写新建用户脚本,要求提示输入姓名,如果空就提示“请输入合法的用户名”并且继续要求输入姓名,如果用户存在,就提示“用户已经存在”,并且继续要求输入姓名;然后提示输入密码,密码要求隐藏,而且密码的位数要求至少3位,否则提示“密码位数要求3位数”,然后继续提示输入密码,如果账号密码都输入成功就提示“用户名新建成功”(要求使用until语句)实验案例521针对变量的不同取值,分别执行不同的命令序列

case语句的结构case

变量值in模式1)

命令序列1

;;模式2)

命令序列2

;;……*)

默认命令序列esaccase

控制指令

instart)

启动XX服务

;;stop)

停止XX服务

;;……*)

显示服务脚本的用法esaccase变量=模式1esac结束分支命令序列1…;;有变量=模式2变量=其他值(*)默认命令序列……无是否否命令序列2…;;有无是22击键类型识别提示用户输入一个字符判断出该字符是字母、数字或者其他字符case语句应用示例[root@localhost~]#cathitkey.sh#!/bin/bashread-p"请输入一个字符,并按Enter键确认:"KEYcase"$KEY"in[a-z]|[A-Z])echo"您输入的是字母。"

;;[0-9])echo"您输入的是数字。"

;;

*)echo"您输入的是空格、功能键或其他控制字符。"esac匹配小写或大写字母匹配数字0-9[root@localhost~]#./hitkey.sh请输入一个字符,并按Enter键确认:k您输入的是字母k。[root@localhost~]#./hitkey.sh请输入一个字符,并按Enter键确认:8您输入的是数字8。[root@localhost~]#./hitkey.sh请输入一个字符,并按Enter键确认:^[[19~您输入的是空格、功能键或其他控制字符。按功能键F823数字范围识别判断分数范围,分出优秀、合格、不合格三档case语句应用示例[root@localhost~]#cattest.shread-p"请输入您的分数(0-100):"GRADEcase"$GRADE"in100|9[0-9]|8[5-9])echo"$GRADE分!优秀";;8[0-4]|[67][0-9])echo"$GRADE分,合格"

;;*)echo"$GRADE分?不合格"

;;esac大于等于85小于等于100大于等于60小于等于8424编写系统服务脚本使用start、stop、restart等参数来控制服务服务控制指令通过位置变量$1传入能够通过chkconfig命令来管理此服务case语句应用示例[root@localhost~]#cat/etc/init.d/myprog#!/bin/bash#chkconfig:-9010#description:StartupscriptforsleepServercase"$1"instart)

echo正在启动$0服务

;;stop)

echo正在停止$0服务

;;restart|reload)$0stop$0start

;;*)

echo"用法:$0{start|stop|restart}"esac用于chkconfig识别的配置根据$1传入的控制指令分别执行不同操作25实验案例6编写脚本显示如下图所示效果,要求选择一个菜单后,不用按回车,马上实现菜单相应的功能,显示完毕按任意键回到菜单,输入0退出菜单26

***Menu***1.Displaydiskspace2.Displayinterfaceinformation3.Displaymemoryusage0.ExitmenuEnteroption:文件系统容量已用可用已用%%挂载点/dev/sda2367G9.6G339G3%/tmpfs1.9G124K1.9G1%/dev/shm/dev/sda197M30M63M33%/bootPressanykeytocontinue

***Menu***1.Displaydiskspace2.Displayinterfaceinformation3.Displaymemoryusage0.ExitmenuEnteroption:4Sorry,wrongselectionPressanykeytocontinue27Shell函数应用Shell函数概述在编写Shell脚本程序时,将一些需要重复使用的命令操作,定义为公共使用的语句块,即可称为函数合理使用Shell函数,可以使脚本内容更加简洁,增强程序的易读性,提高执行效率功能模块化,方便协同合作Shell函数由两部分组成:函数名(在一个脚本中必须唯一)函数体(命令或语句集合)28Shell函数应用定义新的函数(必须先定义后使用)调用已定义的函数向函数内传递参数(可以使用位置参数)function

函数名

{命令序列}

函数名(){命令序列}或者函数名函数名参数1参数2...29Shell函数应用示例应用示例:在脚本中定义一个加法函数,用于计算2个整数的和调用该函数计算(12+34)、(56+789)的和#!/bin/bashadder(){echo$(($1+$2))}adder1234adder56789[root@localhost~]#./adderfun.sh46845验证脚本执行结果定义函数30Shell函数应用示例新安装的mysql配置管理员密码的函数默认新安装的mysql管理员密码为空mysqlpass(){

mysql-uroot-e"usetest;"if(($?==0))then

mysqladmin-urootpassword'123'&&echo"mysql密码修改成功"else

echo"mysql无法修改密码"exit1fi}31Shell函数应用示例检查rpm包的函数如果rpm已经安装,则显示“包isinstalled”如果rpm包未安装,则用yum安装,安装好显示“包installok”checkRPM(){fori

#就是foriin$@获取所有位置参数doif!rpm-q"$i"&>/dev/nullthenecho"pleasewaitamoment"yuminstall"$i"-y&>/dev/nullecho"$iinstallok"elseecho"$iisinstalled"fidone}checkRPMhttpdmysqlmysql-serverphpphp-mysql[root@localhost~]#./test.shhttpdisinstalledpleasewaitamomentmysqlinstallokpleasewaitamomentmysql-serverinstallokpleasewaitamomentphpinstallokpleasewaitamomentphp-mysqlinstallok32Shell函数应用示例检查rpm包的函数如果rpm已经安装,则显示“包isinstalled”如果rpm包未安装,则用yum安装,安装好显示“包installok”如果希望是在运行脚本的时候输入位置参数若要./test1.shhttpdmysql-serverphpphp-mysqlcheckRPM(){fori

#就是foriin$@获取所有位置参数doif!rpm-q"$i"&>/dev/nullthenecho"pleasewaitamoment"yuminstall"$i"-y&>/dev/nullecho"$iinstallok"elseecho"$iisinstalled"fidone}checkRPM$@修改如下所示[root@localhost~]#./22.shhttpdmysqlmysql-serverphpphp-mysqlhttpdisinstalledpleasewaitamomentmysqlinstallokpleasewaitamomentmysql-serverinstallokpleasewaitamomentphpinstallokpleasewaitamomentphp-mysqlinstallok33函数返回值函数的退出状态有两种方式默认退出状态:函数的最后一条命令返回的退出状态使用return命令:以特定的退出状态退出函数使用函数输出:直接将函数的结果赋值给变量34函数返回值函数默认退出状态:函数的最后一条命令返回的退出状态[root@localhost~]#cattest1.shfunc(){rpm-qsadfsdf&>/dev/nullecho'$?'is$?ls/etc/passwd}funcechofuncexitstatusis$?[root@localhost~]#bashtest2.sh$?is1/etc/passwdfuncexitstatusis0[root@localhost~]#cattest2.shfunc(){ls/etc/passwdecho'$?'is$?rpm-qsadfsdf&>/dev/null}funcechofuncexitstatusis$?[root@localhost~]#bashtest2.sh/etc/passwd$?is0funcexitstatusis135函数返回值addUser(){foriin$@doif[[$i==haha]];thenreturn14elseuseradd$ifidone}addUser$@echo$?[root@localhost~]#./test.shxixihahahehe14[root@localhost~]#grephehe/etc/passwd[root@localhost~]#return指定退出状态,后面的语句不会执行hehe没有创建函数使用retun命令指定退出状态,只能用于函数返回值。[root@localhost~]#./test.sh/etc/etc目录占用空间是:33M[root@localhost~]#./test.sh/usr/local/usr/local目录占用空间是:140K36函数返回值直接将函数的结果赋值给变量[root@localhost~]#cattest.shfunc(){du-sh$1|tr-d'\t'|cut-d'/'-f1}size=$(func$1)echo$1目录占用空间是:$size直接将函数的输出赋值给变量37函数返回值num1(){foriin$(seq$1);doecho-n1done}num2(){((j=32-$1))foriin$(seq$j);doecho-n0done}a=$(num1$1)b=$(num2$1)echo$a$b直接将函数的结果赋值给变量38函数中的变量函数使用两种变量全局变量:在函数内部定义的变量,脚本主代码可以获取,脚本主代码定义变量,函数内部也可以获取局部变量:local变量名,确保变量仅在函数内部使用func(){echoais$a

b=100}a=200funcechobis$bfunc(){echoais$alocalb=100}a=200funcechobis$b39函数库文件应用函数库文件如果多个脚本需要调用重复的函数,没必要在每个脚本中定义,只需要创建函数库文件,将需要的函数都放到这个库文件每个脚本只需要一条语句调用库文件即可注意不能把库文件当做普通脚本一样在脚本中运行,那样那些函数将不会出现在脚本中40函数库文件应用创建库文件在脚本中调用库文件(注意库文件的路径)函数1(){命令序列}函数2(){命令序列}…..source或者‘.’点操作符库文件路径41函数库文件应用还可以将库文件在.bashrc中定义source/opt/lib.sh全局函数可以在当前shell的所有子shell中随意运行

exprot-fport将函数输出为全局函数42实验案例7检查服务的函数,显示效果如图所示检查服务状态,启动的要显示正常,未启动的要重启重启后再次检查,还未启动的,要显示服务有问题要检查服务名称是否错误[root@localhost~]#./test.shsmbvsftpdhttpdsmb状态正常vsftpd状态正常httpd状态正常[root@localhost~]#servicesmbstop关闭SMB服务:[确定][root@localhost~]#servicehttpdstop停止httpd:[确定][root@localhost~]#./test.shsmbvsftpdhttpdsmb重启后已经okvsftpd状态正常httpd重启后已经ok先停止FTP服务,然后故意改错FTP的配置文件[root@localhost~]#servicevsftpdstop关闭vsftpd:[确定][root@localhost~]#echodsalkjf>>/etc/vsftpd/vsftpd.conf[root@localhost~]#./test.shsmbvsftpdhttpdsmb状态正常500OOPS:missingvalueinconfigfilefor:dsal

温馨提示

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

评论

0/150

提交评论