[toc]
循环的基本概述
循环分类
| 循环名称 | 循环含义 | 使用场景 | 
| while循环 | 当型循环 | 死循环/有条件的循环/一行一行的读取文件 | 
| do until循环 | 直到型循环,一直循环直到不满足条件 | 没啥场景,因为有for循环 | 
| for循环 | 通用型 | 很多场景都可以使用 | 
while循环介绍
while循环语法
| 12
 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 <条件表达式>;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
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 
 | 
 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
| 12
 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
 
 | 
 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 循环更加有用。
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 
 | 
 until <条件表达式>;do
 cmd1
 done
 
 
 until 话费是否充足;do
 打电话
 done
 
 | 
for循环
for循环语法
无法指定循环次数,表达式有多少内容就循环多少次
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 
 | 
 for var in 变量表达式;do
 cmd1
 cmd2
 done
 
 
 for var in 变量表达式
 do
 cmd1
 cmd2
 done
 
 
 1.以空格为分隔符的字符串
 2.以空格为分隔符的数字
 3.数组
 4.命令结果
 5.文件内容(注意for并不是按行读取,如果每一行都没有空格还行,但是一旦遇到空格就会分隔开)
 
 | 
实战示例
| 12
 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
 
 | 
可指定循环次数格式
| 12
 3
 4
 
 | for((i=1;i<=10;i++));do
 echo $i
 done
 
 | 
for也可以无限循环
| 12
 3
 4
 
 | for (( ; ; ));do
 echo 123
 done
 
 | 
循环控制语句
break 跳出所有循环
break命令允许跳出所有循环(终止执行后面的所有循环)。
如下例子:脚本进入死循环直至用户输入数字大于5。
要跳出这个循环,返回到shell提示符下,需要使用break命令。
实战示例
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 
 | vim break.sh
 
 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命令类似,只有一点差别,它不会跳出所有循环,仅仅跳出当前循环。
| 12
 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
 
 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读取文件内容
| 12
 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
 曾老湿
 苍井空
 武藤兰
 天海翼
 西野翔
 
 
 
 vim while.sh
 
 exec < student.txt
 while read name;do
 echo $name
 echo "------"
 done
 
 
 sh while.sh
 曾老湿
 ------
 苍井空
 ------
 武藤兰
 ------
 天海翼
 ------
 西野翔
 ------
 
 
 
 vim while.sh
 
 cat student.txt|while read line_name;do
 echo $line_name
 echo "------"
 done
 
 
 
 while read name;do
 echo $name
 echo "------"
 done < student.txt
 
 | 
实战练习:while读文件
需求:
写一个脚本,读取下面文件内容,并算出所有人年龄总和
交付方案
| 12
 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
 
 
 
 sum=0
 while read line;do
 age=`echo $line | awk '{print $2}'`
 ((sum+=age))
 done < student.txt
 echo $sum
 
 
 
 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