[转帖]流程控制之for循环

流程,控制,for,循环 · 浏览次数 : 0

小编点评

## 语法 **1. shell风格语法 for 变量名 [ in 取值列表 ]do\t循环体done** ```shell for i in {1,2,3};do echo $idone done ``` **2. c语言风格语法 for ((初值;条件;步长))do\t\t循环体doneshell风格的for,常用in列表方式for i in 1 2 3for i in {1,2,3}for i in {1..9}for i in {9..1}for i in {a..z}for i in {A..Z}for i in {X..Z}for i in $(命令) # 例如:for i in $(head -10 /etc/passwd);do echo $i|cut -d: -f1,2;done for i in $(find ...)continue与forcontinue:默认退出本次循环break:默认退出本层循环 ``` **3. 检查内网存活的ip,使用&符号提升脚本的运行效率** ```bash for i in {1..254}do (ping -W 1 -c 1 192.168.12.$i &> /dev/null && echo 192.168.12.$i) & done ``` **4. 编写文件类型测试脚本,支持多个参数** ```bash cat file.sh #!/bin/bashfor i in $@do if [[ -d $i ]];then \techo \"$i is directory.\"\telif [[ -b $i ]];then \techo \"$i is block device.\" elif [[ -f $i ]];then \techo \"$i is a regular file.\" else \techo \"unknow.\" fidone[root@egon /]# chmod +x file.sh [root@egon /]# [root@egon /]#gt;/dev/null id $name$i &>/dev/null done else \techo \"$i is not a valid file.\" fi done ``` **5. 嵌套多层for循环,结合break与continue,(了解即可)** ```bash for i in {0..3}do echo -e \"第一层循环:loop$i\" for j in {0..3} do echo -e "\\t第二层循环:loop$j" for n in {0..3} echo -e "\\t\\t第三层循环:loop$n:$i$j$n" if ((n==2));then break 3 fi done donedone#2、使用continuecontinue = continue 1在当次循环中忽略continue后续的代码就是:立即结束当前循环中的当次循环,而转入当前循环的下一次循环continue 2 等同于 break 1continue 3 等同于 break 2 done ``` **6. 示例 for i in {0..3}do\t循环体,结合break与continue,(了解即可)** ```bash for i in {0..3}do echo -e \"第一层循环:loop$i\" for j in {0..3} do echo -e "\\t第二层循环:loop$j" for n in {0..3} echo -e "\\t\\t第三层循环:loop$n:$i$j$n" if ((n==2));then continue 3 fi done donedone#2、使用continuecontinue = continue 1在当次循环中忽略continue后续的代码就是:立即结束当前循环中的当次循环,而转入当前循环的下一次循环continue 2 等同于 break 1continue 3 等同于 break 2 done ```

正文

https://www.cnblogs.com/caodan01/p/14949052.html

 

 

一 语法

#===========》Shell风格语法
for 变量名 [ in 取值列表 ]
do
	循环体
done

#===========》C语言风格语法
for ((初值;条件;步长))
do	
	循环体
done

shell风格的for,常用in列表方式

for i in 1 2 3
for i in {1,2,3}
for i in {1..9}
for i in {9..1}
for i in {a..z}
for i in {A..Z}
for i in {X..Z}
for i in $(命令)  # 例如:for i in $(head -10 /etc/passwd);do echo $i|cut -d: -f1,2;done
for i in $(find ...)

continue与for

continue:默认退出本次循环

break:默认退出本层循环

二 案例

案例1:shell风格的for

for i in {1..10}
do
    echo $i
done

案例2:c语言风格的for

for ((i=1;i<=10;i++))
do
    echo $i
done

案例3:检查内网存活的ip,使用&符号提升脚本的运行效率

#!/bin/bash

for i in {1..254}
do
    (ping -W 1 -c 1 192.168.12.$i &> /dev/null && echo 192.168.12.$i) &
done

案例4:编写文件类型测试脚本,支持多个参数

[root@egon /]# cat file.sh 
#!/bin/bash

for i in $@
do
	if [[ -d $i ]];then
    	echo "$i is directory."
	elif [[ -b $i  ]];then
    	echo "$i is block device."
    elif [[ -f $i ]];then
    	echo "$i is a regular file."
    else
    	echo "unknow."
    fi
done
[root@egon /]# chmod +x file.sh 
[root@egon /]# 
[root@egon /]# ./file.sh a.txt /etc /root /abc
a.txt is a regular file.
/etc is directory.
/root is directory.
unknow.

案例5:可以直接在命令行编写for循环

[root@egon /]#  for i in {1..10};do [ $i -eq 5 ] && continue || echo $i;done
[root@egon /]#  for i in {1..10};do [ $i -eq 5 ] && break || echo $i;done

案例6:统计dev下每种文件类型的数量

#!/bin/bash
dir='/dev'
for i in `ls $dir`
do
    if [ -b $dir/$i ];then
        ((block++))  # 或者 let block++,下同
    elif [ -f $dir/$i ];then
        ((file++))
         
    elif [ -d $dir/$i ];then
        ((directory++))
    else
        ((unkown++))
    fi
done

echo 'block' $block
echo 'regular file' $file
echo 'directory' $directory
echo 'unkown' $unkown

案例7:向脚本传递一个用户名,验证这个用户是否存在.

[root@egon ~]# cat testuser.sh 
#!/bin/bash
id $1 &> /dev/null
if [ $? -eq 0 ];then
    echo "用户$1存在"
else
    echo "用户$1不存在"
fi
[root@egon ~]# ./testuser.sh root
用户root存在

案例8:添加30个用户,再将它们删除

for i in {1..30};
do
    useradd user$i&&echo "user$i create successful"
done


for i in {1..30};
do
    userdel -r user$i&&echo "user$i delete successful"
done

案例9:输入账号信息,输入个数,批量创建用户user01、user02、user03...,密码默认123456

[root@egon shell]# cat adduser.sh 
#!/bin/bash

read -p "请输入创建的用户名信息: " name
read -p "请输入创建的用户数量: " count

for i in `seq -w $count`
do
    echo $name$i
    useradd $name$i &>/dev/null
    echo 123456 | passwd --stdin $name$i &>/dev/null
    id $name$i &>/dev/null
    [ $? -eq 0 ] && echo "$name$i create is ok" || echo "$name$i create is failed"
done

案例10:嵌套多层for循环,结合break与continue,(了解即可)

#1、使用break:
break 默认参数是 1 
所以写 break 等于 break 1
意义:退出当前循环层
break 2 则向上退出2层循环 当前循环也计算在退出层次里

# 示例
for i in {0..3}
do
    echo -e "第一层循环:loop$i"
    for j in {0..3} 
    do
        echo -e "\t第二层循环:loop$j"
        for n in {0..3}
        do
            echo -e "\t\t第三层循环:loop$n:$i$j$n"
            if ((n==2));then
                break 3
            fi
        done
    done
done


#2、使用continue
continue = continue 1
在当次循环中忽略continue后续的代码
就是:立即结束当前循环中的当次循环,而转入当前循环的下一次循环

continue 2 等同于 break 1
continue 3 等同于 break 2
总结:continue n 等同于 break n-1

for i in {0..3}
do
    echo -e "第一层循环:loop$i"
    for j in {0..3} 
    do
        echo -e "\t第二层循环:loop$j"
        for n in {0..3}
        do
            echo -e "\t\t第三层循环:loop$n:$i$j$n"
            if ((n==2));then
                continue 3
            fi
        done
    done
done
测试zabbix
测试zabbix
[root@10-176-8-6 ~]# cat 2.txt 
10.227.47.24
10.227.47.11
10.227.47.10
10.227.47.9
10.227.47.8
10.227.47.7
10.227.47.6
[root@10-176-8-6 ~]# for i in `cat 2.txt`; do zabbix_get -s $i -k 'system.uname'; done

与[转帖]流程控制之for循环相似的内容:

[转帖]流程控制之for循环

https://www.cnblogs.com/caodan01/p/14949052.html 目录 一 语法 二 案例 一 语法 # 》Shell风格语法 for 变量名 [ in 取值列表 ] do 循环体 done # 》C语言风格语法 for ((初值;条件;步长)) do 循环体 don

[转帖]精通awk系列(19):awk流程控制之break、continue、next、nextfile、exit语句

https://www.cnblogs.com/f-ck-need-u/ 回到: Linux系列文章 Shell系列文章 Awk系列文章 break和continue break可退出for、while、do...while、switch语句。 continue可让for、while、do...wh

[转帖]使用 tc netem 模拟网络异常

https://cizixs.com/2017/10/23/tc-netem-for-terrible-network/ 在某些情况下,我们需要模拟网络很差的状态来测试软件能够正常工作,比如网络延迟、丢包、乱序、重复等。linux 系统强大的流量控制工具 tc 能很轻松地完成,tc 命令行是 ipr

[转帖][译] 流量控制(TC)五十年:从基于缓冲队列(Queue)到基于时间(EDT)的演进(Google, 2018)

http://arthurchiao.art/blog/traffic-control-from-queue-to-edt-zh/ 译者序 本文组合翻译了 Google 2018 年两篇分享中的技术部分,二者讲的同一件事情,但层次侧重不同: Netdev 2018: Evolving from AF

[转帖]TCP流量控制_(滑动窗口)

一、TCP vs. UDP TCP可提供可靠的数据传输而UDP无法做到,那我们为什么还用UDP? ·使用UDP传送单条消息的开销要比TCP小 ·响应式通信,UDP的速度要比TCP快。 DNS是应用UDP的绝好例子。 但使用UDP又需要可靠性保证的应用程序必须自行实现可靠性保障功能。 如果需要更高级的

[转帖]Web技术(五):HTTP/2 是如何解决HTTP/1.1 性能瓶颈的?

文章目录 一、HTTP/2 概览二、HTTP/2 协议原理2.1 Binary frame layer2.1.1 DATA帧定义2.1.2 HEADERS帧定义 2.2 Streams and Multiplexing2.2.1 Stream 流量控制2.2.2 Stream 优先级管理 2.3 S

[转帖]TCP BBR 拥塞控制算法

https://www.91tfboys.com/?p=348 BBR是个好东西。众所周知,在TCP连接中,由于需要维持连接的可靠性,引入了拥塞控制和流量管理的方法。Google BBR就是谷歌公司提出的一个开源TCP拥塞控制的算法。 这里不详细介绍BBR的原理,仅放入部分质量较高的BBR资源,供索

[转帖]Linux流控框架:TC和Netfilter

https://www.jianshu.com/p/de30bac5b893 Linux内核内置了一个Traffic Control框架,可以实现流量限速,流量整形,策略应用(丢弃,NAT等)。从这个框架你能想到别的什么吗?或许现在不能,但是我会先简单说一下,和TC框架比较相似的是Netfilter

[转帖]TiDB 5.1 Write Stalls 应急文档

https://tidb.net/blog/ac7174dd#4.%E5%88%A4%E6%96%AD%E6%98%AF%E5%90%A6%E5%87%BA%E7%8E%B0%E4%BA%86%20write%20stall stall 是 rocksdb 的一种流控机制,当 flush/compa

[转帖]TiKV读写流程浅析

https://www.cnblogs.com/luohaixian/p/15227838.html 1.TiKV框架图和模块说明 图1 TiKV整体架构图 1.1.各模块说明 PD Cluster:它是由多个PD节点组成的etcd集群,PD是具有“上帝视角”的管理组件,负责存储元数据和进行负载均衡