shell脚本的编写

if条件语句:

可以根据特定的条件来决定是否执行某项操作,当满足不同的条件时,执行不同的操作;

 

条件测试操作:

在shell环境中可以用执行命令返回的装态(0为成功,其他都为失败)来测试,也可以用linux中专用的工具----test 命令

test 条件表达式 = [ 条件表达式 ]

测试文件状态:

-d 是否为目录

-e 测试文件或目录是否存在

-f 是否为文件

-r 是否有读的权限

-w 是否有写的权限

-x 是否可执行(对自己来讲)

-L 是否为链接文件(link)

 

clip_p_w_picpath001

上面用echo $? 来测试状态实在不够方便,因此我们介绍下面的分隔符“&&”

 

clip_p_w_picpath002

&&表示当前面的命令成功时才会执行后面的命令,否则无显示信息

 

 

整数值的比较:

eq等于

ne 不等于

gt大于

lt小于

ge大于或等于

le 小于或等于

 

当前用户如果小于10个则显示yes

clip_p_w_picpath003

 

查看根分区使用情况,如果超过70% 则显示yes,否则无提示

clip_p_w_picpath005

 

 

字符串比较:

= 匹配

!= 不匹配

-z 检查字符串是否为空

! 取反

判断用户输入的值为110,是则显示yes,不是无提示

clip_p_w_picpath007

 

 

若当前环境变量LANG的内容不是”en.US”,则输出LANG变量的值,是”en.US”则无提示

clip_p_w_picpath009

 

测试文件是否为空:

clip_p_w_picpath011

 

逻辑测试:

同时测试多个条件,根据条件是否都成立或者一个成立,来决定如何操作

&&逻辑与,表示前后两个表达式都成立时整个测试结果为真

|| 逻辑或,表示前后两个表达式至少有一个成立时结果才为真

! 逻辑否,表示指定的条件表达式不成立时结果为真

只要下面两个目录中有一个是文件则显示yes,都不是文件时无显示

clip_p_w_picpath013

 

当前用户是root,并且shell是/bin/bash 时才显示yes 有一个不成立则无显示

clip_p_w_picpath015

 

if 语句结构:

单分支if 语句:

if (条件测试命令) -----then(命令序列----- fi(结束);当条件成立时,执行相应的操作,否则不做任何操作

首先通过条件测试命令的返回状态是否为0,若果是,则执行then后面的语句,如果不是则直接去到fi 后面

双分枝if语句:

if(条件测试命令)----then(命令序列一)----else(命令序列二)----fi(结束);双分支if语句使用了两路命令操作,条件成立与条件不成立时分别执行不同的命令

 

 

多分枝if语句:

if(条件测试命令一)----then(命令序列一)-----elif(条件测试命令二)----

then(命令序列二)------else(命令序列三)-----fi(结束);嵌套使用,多次判断

 

 

if应用实例:

 

检查/var/log/messages 文件是否存在,如果存在则统计行数,如果不存在,不做任何操作

clip_p_w_picpath017

clip_p_w_picpath019

 

提示用户指定备份目录的路径,若目录已经存在则提示用户后跳过,若目录不存在,则显示相应信息后创建该目录

clip_p_w_picpath021

clip_p_w_picpath023

 

统计当前登录到系统中的用户数量,并判断是否超过三个,若是则显示实际数量并给出警告信息,否则列出登录用户的账号及所在的终端

clip_p_w_picpath025

clip_p_w_picpath027

 

检查portmap服务是否已经启动,如已经启动则给出正在运行信息,若没有启动则去检查是否存在/etc/init.d/portmap可执行脚本,存在则其启动该服务,如不存在则给出没有该服务的信息

clip_p_w_picpath029

clip_p_w_picpath031

 

for循环语句:

在shell脚本中使用for循环语句可以为变量设置一个取值列表,每次读取列表中不同的变量值并执行相应的命令操作,变量使用完以后,则退出循环。shell中的for循环语句不需要执行条件判断,其使用的变量的取值来自于预先设置的值列表

语句格式:

for 变量名 in 取值列表

do

命令序列

done

 

上面使用in为用户自定义变量设置了一个取值列表(以空格分隔的多个值),for语句第一次执行时,将类表中的第一个值给变量,然后执行do后面的命令,然后取第二个值给变量执行do后面的命令,直到列表中值用完,则执行done 结束

 

 

for语句应用实例:

依次输出三条信息,包括一天中的morning,noon,evening字串

clip_p_w_picpath033

clip_p_w_picpath035

 

 

对于使用/bin/bash 作为登录shell的用户,检查他们在/opt/目录中的拥有的文件或子目录的数量,对于超过100个的,列出具体是指及对应的账号

clip_p_w_picpath037

clip_p_w_picpath039

 

计算/etc/目录中所有的”*/conf”配置文件的所占用的总的空间大小

clip_p_w_picpath041

 

while 循环语句:

可以根据特定的条件重复执行一个命令列表,直到该条件不再满足时为止

while语句的结构:

while 条件测试命令

do

命令序列

done

 

首先通过while判断条件测试命令返回的状态值是否为0(条件成立),如果是,则执行do后面的命令序列,然后返回到while再次进行条件测试并判断返回值状态,如果继续成立则继续执行do后面命令序列,这样一直循环,直到所测试的条件不成立,则跳转到done

 

while应用实例;

由用户从键盘输入一个大于1的整数,并计算东1到该整数之间的各整数的和(高斯运算)

clip_p_w_picpath043

clip_p_w_picpath045

 

批量添加20个系统用户账号,用户名称依次为luojunyong1,luojunyong2.......luojunyong20, 初始密码为123456

clip_p_w_picpath047

clip_p_w_picpath049

 

批量删除用户,将上面的luojunyong1---luojunyong20 删除

clip_p_w_picpath051

clip_p_w_picpath053

 

 

case语句:

适用于多重分支的应用情况,一般if多分支情况都能修改成case语句

case语句结构:

case 变量值 in

模式1)

命令序列1

;;

模式2)

命令序列2

;;

..........

*)

esac

 

 

上述语句中,将使用case后面的“变量值”与模式1,模式2........等进行逐一比较(各模式中为用户预设的固定值),直到找到与之相匹配的值,然后再执行该模式下的命令序列,当遇到双分号时,跳转到esac,表示结束分支。如果一直找不到匹配的值,则执行最后一个模式“*)”后面的命令序列,直到遇到esac后结束分支

 

case 特点:

case行尾必须为单词 in 每一模式必须以右括号结束‘)’

双分号”;;”表示命令序列的结束

匹配模式中可以使用一个方括号”[ ]”表示一个连续的范围,如 [0-9] ; 使用”|”表示或者,如A|B 表示A或者是B

最后的’*)’表示默认模式,前面各种模式都没有匹配到,将执行默认模式后面命令序列

 

case 语句实例:

由用户任意输入键盘上的一个字符,我们来判断这个字符是否为字母,数字或者其他字符,并输出相应的提示信息

clip_p_w_picpath055

clip_p_w_picpath057

 

until 循环语句:

until与while语句非常相似,同样是根据特定的条件决定是否执行循环体中的命令序列,只不过while语句时当测试条件成立时执行,而until循环时当测试条件成立时结束循环

until 循环语句格式:

until 条件测试命令

do

命令序列

done

 

until意思为直到.......为止,则到了测试条件成立时为止,即退出循环

 

until循环语句案例:

同样添加20个用户,luojunyong1.......luojunyong20 以此来比较和while的不同

clip_p_w_picpath059

clip_p_w_picpath061

 

shift 语句:

shift 实际上是bash里的一个内置命令,较少使用,更多的是shell脚本的程序用。执行shift命令后,位置变量($1~$9)中的命令行参数会以此向左传递

例:

当前脚本程序获得的位置变量:

$1=file1 $2=file2 $3=file3 $4=file4

执行以此shift后,(丢弃最左边的值) 各位置变量如下:

$1=file2 $2=file3 $3=file4

再次执行shift命令后,各位置变量的值变成:

$1=file3 $2=file4

 

shift案例:

计算多个整数值的和,需要计算的各个数值由同用户在执行脚本时作为命令行参数给出

clip_p_w_picpath063

clip_p_w_picpath065

 

 

循环控制语句:

break 即中断的意思,用于跳出当前的循环体,但并不退出程序

 

 

案例:

循环提示用户输入字符串,并将每次输入的内容保存到临时文件/tmp/input.txt 中,但是当用户输入END时,退出循环,并统计input.txt 文件中的行数,单词数,字节数,统计完后删除

clip_p_w_picpath067

clip_p_w_picpath069

 

 

continue 命令:

continue 意思即为继续的意思,用于暂停本次循环,跳转至循环语句顶部重新测试条件,本次执行过程中的continue后面的命令序列将被忽略

 

 

continue 案例:

删除系统中的luojunyong1......luojunyong20, 但是luojunyong8 luojunyong18 保留

clip_p_w_picpath071

clip_p_w_picpath073

 

 

shell函数的应用:

编写shell脚本时,经常发现某些命令或语句需要重复使用,从程序的简洁和执行效率上看,通常会把这些命令或程序组成一个公用块,并给其命名,这就是函数

在使用一个shell函数时,要求必须先进行定义(定义函数的语句必须在使用函数的语句之前)

定义函数:

function 函数名 {

命令序列

}

或者

函数名() {

命令序列

}

 

 

函数应用案例:

在脚本中定义一个函数,当用户输入的脚本参数不是start 或 stop 时,加载该函数并给出关于命令的用法帮助信息,否则给出对应的信息

clip_p_w_picpath075

clip_p_w_picpath077

 

函数的参数传递:

在shell脚本中,已经定义的函数就相当于脚本内部设置的命令一样,也可以使用位置参数。如果函数中的命令序列能够处理这些参数,则使用参数传递功能可以实现更加灵活的应用

 

函数的参数传递案例:

在脚本中定义一个加法函数,用于计算两个数的和,并调用该函数分别计算 22+33 44+5555 的和

clip_p_w_picpath079

clip_p_w_picpath081

本文档完毕!!!