ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

shell循环

2022-07-25 18:34:13  阅读:212  来源: 互联网

标签:bin do shell echo while 循环 done


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

标签:bin,do,shell,echo,while,循环,done
来源: https://www.cnblogs.com/ghjhkj/p/16518379.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有