[toc]

循环的基本概述

循环分类

循环名称 循环含义 使用场景
while循环 当型循环 死循环/有条件的循环/一行一行的读取文件
do until循环 直到型循环,一直循环直到不满足条件 没啥场景,因为有for循环
for循环 通用型 很多场景都可以使用

while循环介绍

while循环语法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# while循环语句
## 示例一
while <条件表达式>;do
cmd1
cmd2
done

## 示例二
while <条件表达式>
do
cmd1
cmd2
done

## 示例三
while 没有女朋友;do
找到死
done

## 示例四
while 话费充足;do
打电话
done

# 死循环
## 示例一
while true;do
echo 'hei hei hei'
done

## 示例二
while [ 1 -eq 1 ];do
echo 'hei hei hei'
done

## 示例三
while :;do
echo 'hei hei hei'
done

使用while模拟seq

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 编辑脚本
#!/bin/bash
i=1
while [ $i -le 10 ];do
echo $i
((i++))
done

# 运行脚本
sh seq.sh
1
2
3
4
5
6
7
8
9
10

实战:使用while从1加到100

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 编辑脚本
#!/bin/bash
i=1
num=0
while [ $i -le 100 ];do
((num=num+i))
((i++))
done

echo $num

# 一条命令完成此循环
## 示例一
echo {1..100}|tr ' ' '+'|bc
5050

## 示例二
seq -s+ 100|bc
5050

## 示例三
seq 100|awk '{sum=sum+$1}END{print sum}'
5050

## 示例四
awk 'BEGIN{for(i=1;i<=100;i++)sum=sum+i;print sum}'
5050

until循环(忘记)

until循环语法

until 循环执行一系列命令直至条件为 true 时停止。

until 循环与 while 循环在处理方式上刚好相反。

一般 while 循环优于 until 循环,但在某些时候—也只是极少数情况下,until 循环更加有用。

1
2
3
4
5
6
7
8
9
10
# until循环语句
## 示例一
until <条件表达式>;do
cmd1
done

## 示例二
until 话费是否充足;do
打电话
done

for循环

for循环语法

无法指定循环次数,表达式有多少内容就循环多少次

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# for循环语句
## 示例一
for var in 变量表达式;do
cmd1
cmd2
done

## 示例二
for var in 变量表达式
do
cmd1
cmd2
done

# 变量表达式:
1.以空格为分隔符的字符串
2.以空格为分隔符的数字
3.数组
4.命令结果
5.文件内容(注意for并不是按行读取,如果每一行都没有空格还行,但是一旦遇到空格就会分隔开)

实战示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# 需求:循环以空格为分隔符的字符串
for name in "zls cls wls";do
echo $name
done

# 需求:循环以空格为分隔符的数字
## 示例一
for num in 1 2 3 4 5;do
echo $num
done

## 示例二
for num in {1..10};do
echo $num
done

## 示例三
for zm in {a..z};do
echo $zm
done

# 需求:循环数组
array=("zls" "cls" "wls" "boduols")
for str in ${array[@]};do
echo $str
done

# 需求:循环命令结果
for file in `ls -1 /`;do
echo $file
done

for text in `cat /etc/passwd`;do
echo $text
done

可指定循环次数格式

1
2
3
4
# 指定循环次数for语句
for((i=1;i<=10;i++));do
echo $i
done

for也可以无限循环

1
2
3
4
# 无限循环for语句
for (( ; ; ));do
echo 123
done

循环控制语句

break 跳出所有循环

break命令允许跳出所有循环(终止执行后面的所有循环)。

如下例子:脚本进入死循环直至用户输入数字大于5。

要跳出这个循环,返回到shell提示符下,需要使用break命令。

实战示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 编辑脚本
vim break.sh
#!/bin/bash
while true;do
read -p 'Please Input A Number: ' num
if [ $num -ne 5 ];then
echo "你输入的是 $num"
else
break
fi
done

# 运行脚本
sh break.sh
Please Input A Number: 1
你输入的是 1
Please Input A Number: 2
你输入的是 2
Please Input A Number: 3
你输入的是 3
Please Input A Number: 4
你输入的是 4
Please Input A Number: 5

continue 跳出当前循环

continue命令与break命令类似,只有一点差别,它不会跳出所有循环,仅仅跳出当前循环。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 编辑脚本
vim continue.sh
#!/bin/bash
while true;do
read -p 'Please Input A Number: ' num
if [ $num -ne 5 ];then
echo "你输入的是 $num"
else
continue
fi
done

# 运行脚本
sh continue.sh
Please Input A Number: 1
你输入的是 1
Please Input A Number: 2
你输入的是 2
Please Input A Number: 3
你输入的是 3
Please Input A Number: 4
你输入的是 4
Please Input A Number: 5
Please Input A Number: 6
你输入的是 6
Please Input A Number: 7
你输入的是 7

循环读取文件内容

while读取文件内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
# 查看文件内容
cat student.txt
曾老湿
苍井空
武藤兰
天海翼
西野翔

# 示例一:使用exec读取文件内容,然后进入while循环
## 编辑脚本
vim while.sh
#!/bin/bash
exec < student.txt
while read name;do
echo $name
echo "------"
done

## 运行脚本
sh while.sh
曾老湿
------
苍井空
------
武藤兰
------
天海翼
------
西野翔
------

# 示例二:使用管道符,将文件内容交给while循环
## 编辑脚本
vim while.sh
#!/bin/bash
cat student.txt|while read line_name;do
echo $line_name
echo "------"
done

# 示例三:使用标准输入,将文件内容交给while循环
#!/bin/bash
while read name;do
echo $name
echo "------"
done < student.txt

实战练习:while读文件

需求:

写一个脚本,读取下面文件内容,并算出所有人年龄总和

交付方案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 查看文件内容
cat student.txt
曾老湿 18
苍井空 20
武藤兰 33
天海翼 32
西野翔 18

# 示例一
#!/bin/bash
sum=0
while read line;do
age=`echo $line | awk '{print $2}'`
((sum+=age))
done < student.txt
echo $sum

# 示例二
#!/bin/bash
sum=0
exec < student.txt
while read line;do
age=`echo $line | awk '{print $2}'`
((sum+=age))
done
echo $sum

firewall-cmd -add-source=10.0.0.8 --zone=drop

实战练习:日志分析案例

需求:

写一个shell脚本,防止DDOS攻击,先分析日志,监控某一个IP并发连接数,若短时内PV达到100阈值,则调用防火墙命令,封掉该IP。
可以分析nginx日志或者查看当前网络连接数 ss -ant 或者 netstat -ant
这里使用一个生产的日志 netstat.log