目录
工作中总是有很多工作需要重复性来完成,比如每天都需要执行一次备份、每天都需要分析一次业务的access.log日志,每分钟都需要监测一次主机的状态等等工作,这些重复性的工作我们一般都是使用脚本来完成,对于不需要频繁执行的任务,可以结合计划任务➕脚本完成,但是系统的计划任务只能精确到分,不能满足更频繁的重复工作。
这个时候我们除了依赖计划任务之外还有很多选择,比如脚本中的循环语句。
循环的优点:
脚本在执行任务的时候,总会遇到需要循环执行的时候,比如说我们需要脚本每隔五分钟执行一次ping的操作,除了计划任务,我们还可以使用脚本来完成,那么我们就用到了循环语句。
列表 for 循环( 也加 for 条件循环):用于将一组命令执行已知的次数。下面给出了for循环语句的基本格式:
- for variable_name in {list}
- do
- command
- command
- …
- done
-
- 或者
-
- for variable in a b c
- do
- command
- command
- done
a、赋值来自一个范围
- for var in {1..10}
- do
- echo $var
- done
b、直接赋值
- for var in 1 2 3 4 5
- do
- echo $var
- done
c、赋值来自命令
- for var in `seq 10`
- do
- echo $var
- done
案例演示:
- [root@shell ~]# cat for-1.sh
- #!/bin/bash
-
- #for test in {1..3}
- #for test in 1 2 3
- for test in `seq 3`
- do
- echo "$test"
- echo "hello"
- echo "haha"
- done
-
- # 运行结果一样
- [root@shell ~]# sh for-1.sh
- 1
- hello
- haha
- 2
- hello
- haha
- 3
- hello
- haha
不带列表的 for 循环执行时由用户指定参数和参数的个数,下面给出了不带列表的for循环的基本格式:
- for variable
- do
- command
- command
- …
- done
语法结构举例说明:
- [root@shell ~]# cat for-2.sh
- #!/bin/bash
-
- for var
- do
- echo "$var"
- echo "haha"
- done
- echo "脚本后面有$#个参数"
-
- [root@shell ~]# sh for-2.sh 1 2 3 4
- 1
- haha
- 2
- haha
- 3
- haha
- 4
- haha
- 脚本后面有4个参数
类 C 风格的 for 循环
- for(( expr1;expr2;expr3 ))
- do
- command
- command
- …
- done
-
- # 如:
- for (( i=1;i<=5;i++))
- do
- echo $i
- done
-
-
- # 解释说明
- expr1:定义变量并赋初值 变量初始值
- expr2:决定是否进行循环(条件) 变量的条件
- expr3:决定循环变量如何改变,决定循环什么时候退出 自增或自减运算
-
- # 多变量用法
- for ((A=1,B=10;A<10,B>1;A++,B--))
案例演示:
- [root@shell ~]# vim for-3.sh
- #!/bin/bah
-
- #for (( i=1;i<=5;i++ ))
- for (( x=0,y=10;i<=10,y>=0;x++,y-- ))
- do
- #echo "$i"
- echo "$x $y"
- echo "hhhhhh"
- done
-
- [root@shell ~]# sh for-3.sh
- 0 10
- hhhhhh
- 1 9
- hhhhhh
- 2 8
- hhhhhh
- 3 7
- hhhhhh
- 4 6
- hhhhhh
- 5 5
- hhhhhh
- 6 4
- hhhhhh
- 7 3
- hhhhhh
- 8 2
- hhhhhh
- 9 1
- hhhhhh
- 10 0
- hhhhhh
注意:for 条件不能和 shell 的运算混合使用。
jobs: 写一个扫描脚本,扫描本地网络中存活的机器
案例需求:
判断本地网络中哪些 IP 被使用
案例分析:
采用 ping 的方式判断 IP 是否被占用
算法:
- [root@shell ~]# vim scan_local_ip.sh
- #!/bin/bash
-
- # 根据实际情况填写网段
- netsub="192.168.78."
-
- #1、循环ping IP地址,能 ping 通说明IP存在。
- for ip in `seq 1 254`
- do
- (
- #2、判断Ping结果
- if ping -c1 $netsub$ip &>/dev/null;then
- #3、输出结果
- echo "$netsub$ip is open"
- else
- echo "$netsub$ip is close"
- fi
- ) &
- done
-
- # ( ) 表示在括号内的代码块为一组,并发(同时)执行
- # -c 表示 ping 的次数
- # & 表示后台运行
上一篇文章:【Shell 脚本速成】07、Shell 流程控制——if 判断语句_Stars.Sky的博客-CSDN博客
参考文档:流程控制-for循环语句-组团学