[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 <条件表达式>;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
|
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
|
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 <条件表达式>;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 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((i=1;i<=10;i++));do echo $i done
|
for也可以无限循环
1 2 3 4
| 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
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
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 曾老湿 苍井空 武藤兰 天海翼 西野翔
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读文件
需求:
写一个脚本,读取下面文件内容,并算出所有人年龄总和
交付方案
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
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