一、流程控制@H_502_3@
流程控制语句,即用来实现对程序流程的选择、循环和返回等进行控制的语句。@H_502_3@
格式:@H_502_3@
@H_502_3@
格式:@H_502_3@
@H_502_3@
(2)case判断@H_502_3@
简洁版多分支if语句,当if语句有多个elif时可以使用case语句代替,语言更简洁容易理解。使用场景:判断某个变量值是否为多种情形中的一种时使用。@H_502_3@
格式:@H_502_3@
@H_502_3@
示例:@H_502_3@
@H_502_3@
执行结果:@H_502_3@
@H_502_3@
2、循环@H_502_3@
循环执行就是将循环体内的代码重复运行多次;运行的次数由进入循环的条件和退出循环决定。@H_502_3@
(1)for循环@H_502_3@
格式:@H_502_3@
@H_502_3@
@H_502_3@
列表:变量的取值范围,可以是变量的取值范围,也可以是某个变量的执行结果。@H_502_3@
执行机制:@H_502_3@
依次将列表中的元素赋值“变量名”,每次赋值即执行一次循环体,直到列表中的元素耗尽,循环结束。@H_502_3@
注:for循环的特殊格式:for ((控制变量初始化;条件判断表达式;控制变量的修正表达式))@H_502_3@
控制变量初始化:仅在运行到循环代码段时执行一次@H_502_3@
控制变量的修正表达式:每轮循环结束会先进行控制变量修正运算,而后再做条件判断@H_502_3@
(2)while循环@H_502_3@
格式:@H_502_3@
@H_502_3@
执行机制:@H_502_3@
CONDITION:循环控制条件;进入循环之前,先做一次判断;每一次循环之后会再次做判断;条件为“true”,则执行一次循环;直到条件测试状态为“false”终止循环@H_502_3@
因此:CONDTION一般应该有循环控制变量;而此变量的值会在循环体不断地被修正@H_502_3@
进入条件:CONDITION为true@H_502_3@
@H_502_3@
注:while的特殊用法:(遍历文件的每一行)@H_502_3@
格式:
@H_502_3@
@H_502_3@
在执行循环的时候依次读取/PATH/FROM/SOMEFILE文件中的每一行,且将行赋值给变量line。@H_502_3@
(3)until循环@H_502_3@
格式:@H_502_3@
@H_502_3@
进入条件:CONDITION 为false@H_502_3@
(4)循环控制语句continue, break 以及shift@H_502_3@
Break 用于结束整个循环 ,不会进入下一轮循环@H_502_3@
练习:@H_502_3@
1)打印九九乘法表@H_502_3@
shell脚本@H_502_3@
@H_502_3@
2)打印等腰三角形@H_502_3@
@H_502_3@
Shell脚本:@H_502_3@
@H_502_3@
@H_502_3@
select 循环主要用于创建菜单,按狮子书序排列的菜单项将显示在标准错误上,并显示PS3提符,等待用户输入。@H_502_3@
Select是个无限循环,因此要用break命令退出循环,或者用exit命令终止脚本,也可以适应ctrl +c退出循环@H_502_3@
经常和case联合使用@H_502_3@
示例:@H_502_3@
@H_502_3@
二、trap信号捕捉@H_502_3@
trap '触发指令'信号@H_502_3@
自定义进程收到系统发出的指定信号后,将执行触发指令,而不会执行原操作@H_502_3@
trap '' 信号@H_502_3@
忽略信号的操作@H_502_3@
trap '-' 信号@H_502_3@
恢复原信号的操作@H_502_3@
trap -p@H_502_3@
示例:@H_502_3@
把一段具有独立功能代码封装在一起,并给予命名,后续用到的时候,可以直接通过给定函数名来调用整体函数,使用函数可以实现代码的重用和模式化编程。函数在形式上和shell程序在形式上是相似的,不同的是他不是一个单独的进程,不能单独运行,而是shell程序的一部分。@H_502_3@
语法一:@H_502_3@
@H_502_3@
语法二:@H_502_3@
@H_502_3@
语法三:(最简便也是最常见的)@H_502_3@
@H_502_3@
可放在只包含函数的单独文件中,即在其他shell脚本中可以调用这个文件。使用. /path/to/functions_files 或者source /path/to/functions_files@H_502_3@
@H_502_3@
无参数:function_name @H_502_3@
有参数: funcation_name ar1 arg2 ……argN ,在函数体,可以使用$1,$2,…调用这些参数,还可以使用$*,$@等特殊变量@H_502_3@
@H_502_3@
(1) 默认取决于函数中执行的最后一条命令的退出状态码@H_502_3@
return 从函数中返回,用最后状态命令决定返回值@H_502_3@
变量的作用域不同@H_502_3@
环境变量:当前shell和子shell有效@H_502_3@
本地变量:只在当前shell进程有效,为执行脚本会启动专用子shell进程;因此,本地变量作用范围是当前shell脚本程序文件,包括脚本中的函数@H_502_3@
由于函数是在当前shell中执行,当函数体中有变量的时候,容易与函数体外的变量产生冲突,这时候可以使用局部变量。@H_502_3@
local NAME=VALUE@H_502_3@
阶乘示例:@H_502_3@
@H_502_3@
声明:export �Cf function_name@H_502_3@
查看:export -f 或者declare -xf@H_502_3@
编写服务脚本/root/bin/testsrv.sh,完成如下要求@H_502_3@
(1) 脚本可接受参数:start,stop,restart,status @H_502_3@
(2) 如果参数非此四者之一,提示使用格式后报错退出@H_502_3@
(3) 如是start:则创建/var/lock/subsys/SCRIPT_NAME,并显示“启动成功”@H_502_3@
考虑:如果事先已经启动过一次,该如何处理?@H_502_3@
(4) 如是stop:则删除/var/lock/subsys/SCRIPT_NAME,并显示“停止完成”@H_502_3@
考虑:如果事先已然停止过了,该如何处理?@H_502_3@
(5) 如是restart,则先stop,再start@H_502_3@
考虑:如果本来没有start,如何处理?@H_502_3@
(6) 如是status,则如果/var/lock/subsys/SCRIPT_NAME文件存在,则显示“SCRIPT_NAMEisrunning...”@H_502_3@
如果/var/lock/subsys/SCRIPT_NAME文件不存在,则显示“SCRIPT_NAMEis stopped...”@H_502_3@
其中:SCRIPT_NAME为当前脚本名@H_502_3@
#!/bin/bash ./etc/init.d/functions var='/var/lock/subsys/script_service' start() { if[-e$var];then echo"Thisserviceisalreadyrunning" else touch$var action"servicestartsucessfully" fi } stop() { if[-e$var];then rm-f$var action"servicestop" else action"serviceisnotrunning"false #echo"serviceisnotrunning" fi } restart() { if[-e$var];then sleep0.5#间隔时间 stop sleep0.5 start else action"servicenotrunning"/bin/false sleep0.5 start fi } status() { if[-e$var];then echo-e"\tTheserviceisrunning..." else echo-e"\tTheserviceisnotrunning..." fi } status() { if[-e$var];then echo-e"\tTheserviceisrunning" else echo-e"\tTheserviceisstopd" fi } case$1in start) start ;; stop) stop ;; restart) restart ;; status) status ;; *) echo"Pleaseenterthecorrectparameters(start|stop|restart|status)" esac