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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shell脚本--if流程控制语句和for循环语句的使用相关的知识,希望对你有一定的参考价值。

理论部分:

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

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

例如:批量安装软件包

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

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

3、常用的逻辑测试

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

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

! : 逻辑否

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

逻辑与-实例

技术分享图片

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

技术分享图片

逻辑或-实例

技术分享图片

实战—1

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

技术分享图片

技术分享图片

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变量是定义当前系统的语言属于环境变量

取反就是不等于的意思

技术分享图片

实战2—

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

技术分享图片

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

if 条件测试操作

then

命令序列

fi

技术分享图片

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

实战—1

技术分享图片

技术分享图片

2-2-双分支IF语句

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

语法结构

if 条件测试操作

then(条件成立执行)

命令序列1

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

命令序列2

fi

技术分享图片

实战1—

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

技术分享图片

-c ping包的次数

-i ping包的间隔

-w 超时的时间间隔

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

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

技术分享图片

2-3-多分支if语句

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

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

if 条件测试操作1

then

命令序列1

elif 条件测试2

then

命令序列2

else

命令序列3

fi

技术分享图片

多分支if语句应用

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

vim gradediv.sh

技术分享图片

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

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

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

执行的结果

技术分享图片

实战部分

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

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

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

技术分享图片

vim httpd.sh

技术分享图片

技术分享图片

查看 /var/log/httpderr.log

技术分享图片

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

过滤主版本号

技术分享图片

过滤出次版本号

技术分享图片

vim kernel.sh

技术分享图片

执行:

技术分享图片

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

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

for语句执行的语法结构

for 变量名 in 取值列表

do

命令序列

done

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

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

技术分享图片

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

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

我们这里模拟创建一个

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

vim users.txt

技术分享图片

技术分享图片

查看创建成功的用户

技术分享图片

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

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

将取值列表赋予变量user

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

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

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

技术分享图片

执行脚本:sh –x adduser.sh

技术分享图片

再次执行

技术分享图片

输出了用户已存在,

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

vim deluser.sh

技术分享图片

执行:

技术分享图片

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

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

建立一个ip地址取值列表

vim ip.txt

技术分享图片

vim ping.sh

技术分享图片

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

技术分享图片

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

以上是关于shell脚本--if流程控制语句和for循环语句的使用的主要内容,如果未能解决你的问题,请参考以下文章

Linux | shell脚本-条件判断if和循环语句for

15Shell脚本—流程控制

shell脚本的学习和使用

shell脚本的学习和使用

shell脚本的学习和使用

shell脚本之流程控制