Shell脚本(三)

Shell流程控制

  • 一、if 条件判断语句
    • 1、单分支if语句
    • 2、双分支if语句
    • 3、多分支if语句
  • 二、case 多分支条件语句
  • 三、for 循环语句
    • 语句示例与案例:
      • for 循环语法1
      • for 循环语法2
  • 四、while和until的区别
    • 1、withe 循环语句
    • 2、until 循环语句
  • 五、特殊流程控制语句
    • exit 语句
    • break 语句
    • continue 语句


一、if 条件判断语句

  • 单分支条件语句判断是 if 中最基本的,判断某个条件成功,返回结果;如果不符合条件则执行另个程序。

1、单分支if语句

  • 条件成立,执行程序;如不成立,不进行操作。

单分支流程判断图:
Shell脚本(三)_第1张图片
语句示例与案例:

if [ 条件判断式 ]								# 判断1,如果成立
then											
条件成立执行”命令程序“							# 执行这个 “命令程序” 
fi												# 没有成立,直接退出

磁盘邮件告警案例

#!/bin/bash
#---------xy!---------

DISK=$(df -h | grep "/dev/mapper/centos-root" | awk '{print $5}' | cut -d"%" -f 1)		#摘取磁盘百分比
if [ ${DISK} -ge 2 ]
then
echo "\"/\" 目录磁盘超过2%" 																#公司中可改为邮件,使用率自定义
fi

2、双分支if语句

  • 条件成立,执行第一个命令程序,不成立则执行第二个命令程序。

双分支流程判断图:
Shell脚本(三)_第2张图片
语句示例与案例:

if [ 条件判断式 ]								#条件判断,如果成立
then											
条件成立执行”命令程序1“							#执行程序1
else											
条件不成立执行”命令程序2“							#执行程序2
fi

检查Apache状态案例

#!/bin/bash
#---------xy!---------

CHECK=$(netstat -anpt | grep "httpd" | grep "80" | awk '{print $6}')				#检查http的端口是否是LISTEN
#CHECK=$(nmap -sT 192.168.10.1 | grep "http" | grep "80/tcp" | awk '{print $2}')	#-s扫描 -T所有tcp

if [ "${CHECK}" == "LISTEN" ]														#判断LISTEN
then																				
echo "$(date) 正在运行!" >> /root/acc.log											#执行正在运行语句,追加到acc.log
else																				
systemctl start httpd >> /root/err.log												#启动httpd,追加到err.log
echo "$(date) 正在启动!" >> /root/err.log											#输出信息,追加到err.log
fi

3、多分支if语句

  • 判断测试结果的成立n,执行程序n;n为变量,进行多次判断

多分支流程判断图:
Shell脚本(三)_第3张图片
语句示例与案例:

if [ 条件判断式1 ]
then
条件1成立执行”命令程序1“
elif [ 条件判断式2 ]
then
条件2成立执行”命令程序2“
elif [ 条件判断式3 ]
then
条件3成立执行”命令程序3“
elif [ 条件判断式n ]
then
条件n成立执行”命令程序n“
#...省略更多,,,
else
条件判断式都不成立,最后执行此命令程序
fi

文件或目录检查案例

#!/bin/bash
#---------xy!---------
read -p "请输入文件名:" FILE					#输入的信息

if [ -z "$FILE" ]							#判断是否为空
then
	echo "您未输入任何字符串,文件或目录等"
	exit 1									#可以用echo $?进行判断
elif [ -d "$FILE" ]							#判断是否为目录
	then
	echo "这是一个目录"
	exit 2
elif [ -f "$FILE" ]							#判断是否为文件
	then
	echo "这是个文件"
	exit 3
else
	echo “$FILE 是其他字符串,特殊字符等”		#否则输出其他
	exit 4
fi

Shell脚本(三)_第4张图片

二、case 多分支条件语句

  • case语句和 if…elif…else 语句一样都是多分支条件语句,但是他们俩区别在于:case语句只能判断其中一个并执行对应操作,而if可以判断多总条件关系。

case 多分支流程判断图:
Shell脚本(三)_第5张图片
语句示例与案例:

case  $变量值  in
"变量1")
    命令序列1
    ;;
"变量2")
    命令序列2
    ;;
#...省略更多,,,
* )
    都不是执行此命令
    ;;
esac

Apache服务启动脚本案例

#!/bin/bash
#---------xy!---------
case $1 in
start)
systemctl $1 httpd
echo "$(date) Apache服务已启用!"
;;
stop)
systemctl $1 httpd
echo "$(date) Apache服务已停止!"
;;
status)
#systemctl $CASE httpd
CHECK=$(nmap -sT 192.168.10.1 | grep "http" | grep "80/tcp" | awk '{print $2}')			#判断httpd状态,直接摘取状态对比
if [ "${CHECK}" == "open" ]
then
echo "$(date) Apache服务正在运行!" 
else
echo "$(date) Apache服务未启用!"
fi
;;
restart)
systemctl $1 httpd
echo "$(date) Apache服务已重启!"
;;
*)
echo "只能使用,start,stop,restart,status参数"
esac

Shell脚本(三)_第6张图片

三、for 循环语句

  • for 循环用来固定多次循环不同的值,也把 for 循环称为计数循环

for 循环流程图:
Shell脚本(三)_第7张图片

语句示例与案例:

for 循环语法1

for 变量 in 值1、2、3、4....
do
	执行程序
done  

for 循环语法2

for (( 初始值;循环控制条件;变量变化))
do
	执行程序
done

注:
1、初始值:循环开始时,赋予某个变量的初始值,如 i=1 ;
2、循环控制条件:指定循环次数,如 i<=50 ,循环会到此结束;
3、变量变化:每次变量循环的变化,如 i=i+1 ,表示每次 i 的值都加1.

for 循环批量添加用户

[root@localhost ~]# cat << EOF >> name.txt
> zhangsan
> lisi
> wangwu
> xy
> liming
> EOF
#!/bin/bash
#---------xy!---------

for m in `cat name.txt`
do
useradd $m &>>/dev/null
echo "123123" | passwd --stdin $m &>>/dev/null
done

Shell脚本(三)_第8张图片
1 到 100 的和

#!/bin/bash
#---------xy!---------

s=0
for (( i=1;i<=100;i=i+1 ))	#i自增但不超过100
do
	s=$(( $s+$i ))			
done
echo "1+2+3+4+...+100=$s"	#输出和

Shell脚本(三)_第9张图片

批量ping主机案例

#!/bin/bash
#---------xy!---------

#for i in {1..254}
for i in {1,2,3,4,}
do
	{				#{}&,将大括号里面的内容放入后台去执行
	ip=192.168.10.$i
	ping -c3 -i0.2 -W3  $ip &>> /dev/null
	if [ $? -eq 0 ]
	then
		echo "$(date +%Y-%m-%d,%H:%M:%S) $ip is up" >> up-ip.txt
	else
		echo "$(date +%Y-%m-%d,%H:%M:%S) $ip is down" >> down-ip.txt
	fi
	}&
done
wait					#等待前面内存执行完毕,在执行以下内容
echo "检测完毕,成功地址在up-ip.txt中"
echo "失败地址在down-ip.txt中"

Shell脚本(三)_第10张图片

四、while和until的区别

1、withe 循环语句

  • while循环判断条件式成立,循环会一直继续,直至循环不成立,循环终止。

while 循环流程图:
Shell脚本(三)_第11张图片
语句示例与案例:

while [ 条件判断式 ]
	do
	执行程序
done

批量创建用户案例

#!/bin/bash
#---------xy!---------

NAME="zhangsan"			#名称
XY=1
while [ $XY -le 20 ]	#创建个数
do
useradd ${NAME}$XY &>> /dev/null
echo "123123" | passwd --stdin ${NAME}$XY &>> /dev/null
let XY++
done

Shell脚本(三)_第12张图片
1到100的合

#!/bin/bash
#---------xy!---------

i=1
s=0
while [ $i -le 100 ]		#while循环小于等于100
do
	s=$(( $s+$i ))
	i=$(( $i+1 ))
done
echo "$s" 

2、until 循环语句

  • until 循环,和 while 循环恰好相反,until 循环时只要判断不成立就进行循环,一旦条件成立,则终止循环。
until [ 条件判断式 ]
	do
	执行程序
done

until 对于 while区别

#!/bin/bash
#---------xy!---------

i=1
s=0
until [ $i -gt 100 ]		#until大于100停止循环
do
	s=$(( $s+$i ))
	i=$(( $i+1 ))
done
echo "$s" 

五、特殊流程控制语句

exit 语句

  • 系统的命令也有 exit 的,用于退出登录当前用户的状态。在shell中可以用 $? 来退出当前脚本,并用来判断退出的程序。
exit 返回值

exit 应用案例

#!/bin/bash
#---------xy!---------

for i in {1,2,3}
do
	echo "192.168.10.$i"
done
exit3		#输出指定返回值,默认成功为0

Shell脚本(三)_第13张图片

break 语句

  • break 的作用是:当程序执行到此 break 语句时,会直接结束当前循环。
    break 应用案例
#!/bin/bash
#---------xy!---------

for i in {2,3,4,5,6}
do
	if [ "$i" -eq 4 ]
	then
	break		#直接退出程序
	fi 
	echo "$i"
done

Shell脚本(三)_第14张图片

continue 语句

  • continue 语句跟 break 的区别:break 是结束当前循环,以及之后的循环;而 continue 是结束当前循环,继续下次循环。

continue 应用案例

#!/bin/bash
#---------xy!---------

for i in {2,3,4,5,6}
do
	if [ "$i" -eq 4 ]
	then
	continue		#跳过此次循环
	fi 
	echo "$i"
done

Shell脚本(三)_第15张图片

你可能感兴趣的