shell循环


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

(0)
上一篇 2022年7月26日
下一篇 2022年7月26日

相关推荐

发表回复

登录后才能评论