Shell流程控制---for循环语句
2021年4月9日
脚本再执行任务的时候,总会遇到需要循环执行的时候,比如说我们需要脚本每隔五分钟执行一次 ping 的操作,除了计划任务,我们还可以使用脚本来完成,那么我们就用到了循环语句。
for 循环介绍
很多人把for循环叫做条件循环,或者 for-i-in
。其实前者说的就是 for 的特性,for 循环的次数和给予的条件是成正比的,你让它循环 5 次,它就循环 5 次;后者说的是 for 的语法。
for 语法
for 语法一
for var in vlue1 value2 ......;do
commands
done
接下来看段代码吧,循环输出数字 1-9
[root@localhost ~]# cat for_1.sh
#!/bin/bash
for i in `seq 1 9`;do
echo $i
done
for 语法二 (C 格式 for 循环)
for ((变量;条件;自增减运算));do
commands
done
还是刚才的循环输出数字 1-9
[root@localhost ~]# cat for_2.sh
#!/bin/bash
for ((i=1;i<10;i++));do
echo $i
done
补充
seq
命令:seq
命令可以输出连续的数字,或者输出固定间隔的数字,或者输出指定格式的数字。
命令格式如下:
[root@localhost ~]# seq [选项] 首数 步进 尾数
选项:
-s :指定输出的分隔符,默认为 \n,即默认为回车换行
-w :指定为定宽输出,不能和 -f 一起用
-f :按照指定的格式输出,不能和 -w 一起使用
[root@localhost ~ ]# echo `seq 1 5` #1---5之间,默认步进为1的数字
1
2
3
4
5
[root@localhost ~ ]# echo `seq 10 -2 1` #10---1之间,步进为-2的数字
10
8
6
4
2
C 格式 for 循环双变量
[root@localhost ~ ]# vim for_3.sh
#!/bin/bash
for ((m=9,n=1;m>1,n<10;m--,n++));do
echo -e "$m\t$n"
done
[root@localhost ~ ]# bash for_3.sh
9 1
8 2
7 3
6 4
5 5
4 6
3 7
2 8
1 9
循环控制语句
sleep N
脚本执行到该步休眠 N 秒
看段代码吧
[root@localhost ~ ]# vim sllep.sh
#!/bin/bash
echo -n "倒计时:"
for i in `seq 9 -1 1`;do
echo -n -e "\b$i"
sleep 1
done
echo
continue
跳出循环中的某次循环
继续看代码,默认循环输出 1-9,但是使用 continue 跳过输出 5
[root@localhost ~ ]# vim continue.sh
#!/bin/bash
for ((i=1;i<10;i++));do
if [ $i -eq 5 ];then
continue
else
echo $i
fi
done
break
跳出循环继续执行后续代码
还是看段代码,默认循环输出 1-9,当输出到5的时候跳出循环
[root@localhost ~ ]# vim break.sh
#!/bin/bash
for i in `seq 1 9`;do
echo $i
if [ $i -eq 5 ];then
break
fi
done
示例
监控主机存活的脚本
[root@localhost ~ ]# vim ping.sh
#!/bin/bash
for ((;;));do
ping -c1 $1 &> /dev/null
if [ $? -eq 0 ];then
echo -e "`date +"%F %H:%M:%S"`:$1 is \033[32m UP \033[0m"
else
echo -e "`date +"%F %H:%M:%S"`:$1 is \033[31m Down \033[0m"
fi
sleep 5 #每隔5秒循环一次,生产环境建议1分钟以上
done
[root@localhost ~ ]# bash ping.sh 192.168.2.123
2021-2-7 13:32:21:192.168.2.123 is UP
2021-2-7 13:32:26:192.168.2.123 is UP
2021-2-7 13:32:31:192.168.2.123 is UP
2021-2-7 13:32:36:192.168.2.123 is UP
^C
[root@localhost ~ ]# bash ping.sh 192.168.2.321
2021-2-7 13:33:13:192.168.2.321 is Down
2021-2-7 13:32:18:192.168.2.321 is Down
2021-2-7 13:32:23:192.168.2.321 is Down
2021-2-7 13:32:28:192.168.2.321 is Down
[root@localhost ~ ]#