shell 循环
循环的分类
循环名称 | 循环含义 | 应用场景 |
---|---|---|
while | 当型循环 | 死循环、按行读取文件、有条件循环 |
do until | 直到型循环 | 没有场景 |
for | 通用型循环 | 很多应用场景 |
循环语法
while循环
while <条件表达式>;do
cmd1
cmd2
cmd3
done
while <条件表达式>
do
cmd1
cmd2
cmd3
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循环模拟for循环seq
n=1
while [ $n -le 10 ];do
echo $n
((n++))
done
使用while循环实现1加到100
#!/bin/bash
a=0
i=1
while [ $i -le 100 ];do
((a=a+i))
((i++))
done
echo $a
[root@web02 ~]# echo {1..100}|tr ' ' '+'|bc
5050
[root@web02 ~]# seq -s+ 100|bc
5050
[root@web02 ~]# seq 100 |awk '{m=m+$1}END{print m}'
5050
[root@web02 ~]# awk 'BEGIN{for(i=1;i<=100;i++)sum=sum+i;print sum}'
5050
until循环(忘记它)
until <条件表达式>;do
cmd1
cmd2
done
until <条件表达式>
do
cmd1
cmd2
done
until循环执行一系列命令直到条件为true时停止
until循环与while循环在处理方式上刚好相反
一般while循环优于until,但在某些时候也只是机上数情况下,until循环更加有用
for循环
语法一
# 无法指定循环次数,变量表达式中有多少内容就循环多少次
for i in 变量表达式;do
cmd1
cmd2
done
for i in 变量表达式
do
cmd1
cmd2
done
变量表达式:
可以是文件的内容(按空格循环)
可以是序列命令的内容
可以是数组中的内容
可以是以空格为分隔符的字符串
语法二
指定循环次数
for((i=1;i<=100;i++));do
echo $i
done
循环的控制语句
continue
break
break跳出循环
break命令允许跳出所有循环(终止后面所有循环)
下面的例子中,脚本进入死循环直至用户输入数字等于5.
#!/bin/bash
while true;do
read -p "请输入一个数字" a
if [ $a -eq 5 ];then
break
else
echo "你输入的是 $a"
fi
done
continue跳出循环
continue命令与break命令类似,只有一点差别,他不会跳出所有损坏,仅仅跳出当前循环
i=0
while [ $i -le 10 ];do
((i++))
if [ $i -eq 5 ];then
continue
else
echo $i
fi
done
while循环读取文件
# for循环读取文件
#!/bin/bash
for i in `cat 1.txt`;do
echo $i
done
# while读取文件
# 方法一
exec < 1.txt
while read i;do
echo $i
done
# 方法二
#!/bin/bash
cat 1.txt|while read i;do
echo $i
done
# 方法三
#!/bin/bash
while read i;do
echo $i
done < 1.txt
作业
案例1
# 日志分析案例
grep tcp netstat.log | awk '{print $5}' | sort -n |uniq -c | sort -n -r|while read i;do
a=`echo $i |awk '{print $1}'`
b=`echo $i |awk '{print $2'}|awk -F : '{print $1}'`
if [ $a -eq 100 ];then
firewall-cmd --add-source=$b --zone=drop
fi
done
案例2
# 在指定目录下,通过随机10个小写字母,然后生成一个文件名:随机密码_zls.txt
#!/bin/bash
for i in `seq 10`;do
a="`tr -cd 'a-z'</dev/urandom|head -c 10`_zls.txt"
touch /tmp/$a
done
案例四
# 创建100个用户生成随机密码并保存到文件
#!/bin/bash
for i in `seq 100`;do
useradd zh${i}
a=`echo $RANDOM`
echo $a | passwd --stdin zh$i &> /dev/null
echo zh${i}:$a >> 4.pass
done
案例五
# 模拟黑客,扫描存活主机,扫描存活端口
#!/bin/bash
. /etc/init.d/functions
for i in `seq 255`;do
ping -c1 -w1 10.0.0.$i &>/dev/null
if [ $? -eq 0 ];then
action 10.0.0.$i /bin/true
for port in `seq 65535`;do
{
port2=`echo ''|telnet 10.0.0.$i $port 2>/dev/null |grep 'Connected'|wc -l`
if [ $port2 -ne 0 ];then
echo "$port 端口存活"
fi
} &
usleep 300
done
fi
done
原创文章,作者:kepupublish,如若转载,请注明出处:https://blog.ytso.com/277022.html