shell脚本(二)--if流程控制语句和for循环语句的使用

理论部分:

1、在简单的脚本中各条语句按顺序执行,从而实现自动化的管理,

顺序单一执行太过机械化,不够“智能”,难以实现更加灵活的系统任务。

例如:批量安装软件包

100台机器 50台已安装 50台未安装

2、shell环境根据$?来判断是否执行成功,当返回值为0时代表执行成功。如果是非0则代表执行异常一般为1或者为1到127之间的整数。

3、常用的逻辑测试

&&:逻辑与,“并且而且”的意思 满足两个条件

||:逻辑或,“或者”的意思 满足两个条件中的一个

! : 逻辑否


逻辑与&&是指并且而且的意思,只有前后两个条件都成立时才会返回值为0(成立)否则就是非0(不成立)

逻辑与-实例

clip_image002

先进入到/usr目录在显示当前所在目录,如果cd没有进入目录后面的命令是不会执行的

clip_image004

逻辑或-实例

clip_image006

实战—1

我们通过逻辑表达判断一下两个变量的值

clip_image007

clip_image009

2、数值的比较

-eq:等于(Equal)

-ne:不等于(Not Equal)

-gt:大于(Greater Than)

-lt:小于(Lesser Than)  

-le:小于或等于(Lesser or Equal)

-ge:大于或等于(Greater or Equal)

格式 [ 数值1 操作符 数值2 ]

3.字符串比较

= 字符串内容相同

!= 字符串内容不同

-z 字符串内容为空

! 取反的意思.

实战1--

若要判断当前系统的语言环境,当发现不是en.US时输出提示信息“$LANG”

$LANG变量是定义当前系统的语言属于环境变量

取反就是不等于的意思

clip_image011

实战2—

-z为对于为赋值的变量进行测试

clip_image013


2-1-单分支if语句的格式

if 条件测试操作

then

命令序列

fi

clip_image015

单分支的结构非常简单,条件成立就执行then命令序列,条件不成立则fi结束

实战—1

clip_image016

clip_image018

2-2-双分支IF语句

双分支的选择结果,要求针对条件成立,条件不成立两种情况分别执行不同的操作

语法结构

if 条件测试操作

then(条件成立执行)

命令序列1

else(否则,条件不成立,则执行)

命令序列2

fi

clip_image020



实战1—


我们编写一个连通性测试脚本通过位置参数$1提供目标主机地址,然后根据ping检测结果给出相应提示

clip_image022

-c ping包的次数

-i ping包的间隔

-w 超时的时间间隔

脚本解释:如果if判断为0则接下来执行then输出目标主机up

如果不为0则执行else输出目标主机down

clip_image024


2-3-多分支if语句

由于if语句可以根据测试结果的成立,

不成立分别执行,所以可以嵌套使用,进行多次判断.

if 条件测试操作1

then

命令序列1

elif 条件测试2

then

命令序列2

else

命令序列3

fi



clip_image026

多分支if语句应用

1. 编写一个成绩分档脚本gradediv.sh根据输入不同的分数来区分优秀、合格、不合格三挡

vim gradediv.sh

clip_image028

首先判断是否大于85 小于 100 如果符合则输出优秀并结束判断

如果小于85 并且大于 60 为优秀 执行then 输出合格

否则 都执行else 其余的都是不合格继续

执行的结果

clip_image030

实战部分

1、编写脚本程序用于监视系统服务httpd的运行状态,要求如下

当服务状态失败时在"/var/log/httpderr.log"文件中记入日志信息。

自动将状态失败的httpd服务重新启动。若重启httpd服务失败,测尝试重新启动服务器主机

clip_image032

vim httpd.sh

clip_image034

clip_image036

查看 /var/log/httpderr.log

clip_image038

2、编写uname.sh脚本判断当前系统的内核主次版本若大于2.4则输出当前版本否则输出提示当前版本太低

过滤主版本号

clip_image040

过滤出次版本号

clip_image042

vim kernel.sh

clip_image044

执行:

clip_image046

3-1-for循环语句的结构

使用for循环语句时,需要指定一个变量及可能的取值列表。跟对不同的取值,执行相同的命令序列直到变量的值取完遍退出循环。取值列表称为for语句的执行条件

for语句执行的语法结构

for 变量名 in 取值列表

do

命令序列

done

其种 变量名可以自定义,do里面还可以嵌套多个if语句done结束循环

in乃是关键字,从哪里取值,多个取值之间使用空格隔开

clip_image048

实验环境:有些时候我们的系统需要多个用户的时候,并且用户名使用员工的拼音为用户名这是也可以使用for循环进行创建并设置初始密码

我们先从人事部取来员工的姓名列表将这个列定义为取值列表

我们这里模拟创建一个

这些用户就作为取值,都是一些厂家的名字.

vim users.txt

clip_image049

clip_image050

查看创建成功的用户

clip_image052

编辑一个脚本 添加用户vim adduser.sh

首先定义一个变量作为取值列表

将取值列表赋予变量user

嵌套一个if语句判断用户是否存在,如果存在则输出用户已存在,否则执行else的命令序列进行添加用户并且设置密码实现取值循环

if判断使用grep awk 过滤出/etc/passwd的第一个字段

使用user_a与取值列表进行比较如果等於则输出用户已存在,如果不等於则执行else的命令序列


clip_image053

执行脚本:sh –x adduser.sh

clip_image054

再次执行

clip_image055

输出了用户已存在,

若要删除刚刚创建的用户可以编写脚本

vim deluser.sh

clip_image057

执行:

clip_image058

好了这就是批量创建用户和批量删除用户

案例根据ip地址列表检测主机状态

建立一个ip地址取值列表

vim ip.txt

clip_image059

vim ping.sh

clip_image061

判断一下当前主机是否存活,如果存活 输出 host is up 否则输出 host is down

clip_image063

这就是简单的for循环语句的应用

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章