• Shell系统学习之循环结构


    for循环语句

    带列表的for循环语句

     不带列表的for语句

    类C风格的for循环语句

    使用for循环处理数组 

    until循环语句

    while循环语句

    break和continue

     小结


    for循环语句

    带列表的for循环语句

    语法如下:

    1. for variable in {list}
    2. do
    3. statement1
    4. ...
    5. done

    在上面的语法中,variable称为循环变量,list是一个列表,可以是一系列数字或者字符串,元素之间用空格隔开,do和done之间的结构称为循环体。

    下面举几个示例:

    1. #!/bin/bash
    2. for var in 1 2 3 4 5 6
    3. do
    4. printf "$var"; printf " "
    5. done
    6. echo
    7. for var in {1..6}
    8. do
    9. printf "$var"; printf " "
    10. done
    11. echo
    12. for day in Mon Tue Wed Thu Fri Sat Sun
    13. do
    14. printf "$day"; printf " "
    15. done
    16. echo
    17. for day in { Mon Tue Wed Thu Fri Sat Sun }
    18. do
    19. printf "$day"; printf " "
    20. done

    结果如下:

    eden_ubuntu@edenubuntu:~/Documents/Shell/5$ ./5-1.sh 
    1 2 3 4 5 6 
    1 2 3 4 5 6 
    Mon Tue Wed Thu Fri Sat Sun 
    { Mon Tue Wed Thu Fri Sat Sun }

     注意字符串不能用{}花括号括起来表示列表。

    上述例子中for循环的步长都是1,实际上,Shell允许用户自己设置步长,语法如下:

    1. for variable in {start..end..step}
    2. do
    3. statement1
    4. ...
    5. done

    start表示起始值,end表示终止值,step表示步长

    下面看示例:

    1. #!/bin/bash
    2. sum=0
    3. for i in {1..100..2}
    4. do
    5. ((sum+=i))
    6. done
    7. echo "$sum"

    结果如下:

    eden_ubuntu@edenubuntu:~/Documents/Shell/5$ ./5-2.sh 
    2500

    for语句是list也可以是Shell命令输出的结果,比如ls命令会输出一个list

     当前ls的命令输出如下:

    eden_ubuntu@edenubuntu:~/Documents/Shell/5$ ls
    5-1.sh  5-2.sh  5-3.sh

    Shell代码如下: 

    1. #!/bin/bash
    2. for file in `ls`
    3. do
    4. echo "$file"
    5. done

    结果如下:

    eden_ubuntu@edenubuntu:~/Documents/Shell/5$ ./5-3.sh 
    5-1.sh
    5-2.sh
    5-3.sh

    还有使用通配符*作为条件列表的,这个*号的作用就是列出当前目录中的所有文件,代码如下:

    1. #!/bin/bash
    2. for file in *
    3. do
    4. echo "$file"
    5. done

     结果如下: 

    eden_ubuntu@edenubuntu:~/Documents/Shell/5$ ./5-4.sh 
    5-1.sh
    5-2.sh
    5-3.sh
    5-4.sh

     不带列表的for语句

    在某些特殊情况下,for循环的条件列表可以完全省略,称为不带列表的for循环语句。此时,Shell将从命令行获取条件列表,请看示例代码

     

    1. #!/bin/bash
    2. for arg
    3. do
    4. echo "$arg"
    5. done

    我们输出参数a b c,结果如下:

    eden_ubuntu@edenubuntu:~/Documents/Shell/5$ ./5-5.sh a b c
    a
    b
    c

     与使用$*做当条件参数的结果一致。

    类C风格的for循环语句

    在Linux上,C/C++是最主流的开发语言,为了适应这部分用户的习惯,bash shell也提供了类C风格的for循环,语法如下:

    1. for ((expression1;expression2;expression3))
    2. do
    3. statement1
    4. ...
    5. done

    举例说明

    1. #!/bin/bash
    2. for ((i=1;i<5;++i))
    3. do
    4. echo "$i"
    5. done

    结果如下:

    eden_ubuntu@edenubuntu:~/Documents/Shell/5$ ./5-6.sh 
    1
    2
    3
    4

    使用for循环处理数组 

    语法如下:

    1. for var in ${array[*]}
    2. do
    3. statement1
    4. ...
    5. done

     其中array表示数组的名称,请看示例:

    1. #!/bin/bash
    2. alist=(Mon Tue Med)
    3. for day in ${alist[*]}
    4. do
    5. echo "$day"
    6. done

    结果如下:

    eden_ubuntu@edenubuntu:~/Documents/Shell/5$ ./5-7.sh 
    Mon
    Tue
    Med

    until循环语句

    until语句的语法是:

    1. until expression
    2. do
    3. statement1
    4. ...
    5. done

    其中当expression为真返回0时,跳出循环体。

    while循环语句

    while语句的语法与until差不多:

    1. while expression
    2. do
    3. statement1
    4. ...
    5. done

    差别在于, while语句是当expression条件为假返回非0时,跳出循环体。与until正好相反

    break和continue

    Shell语句里提供了break和continue用于控制循环。

    break就是跳出循环,continue是跳过当前循环体中continue后面的语句,重新从循环语句开始的位置执行。这里有C语言经验的都了解就不多讲了。补充一点,Shell的break和continue后面可以加数字参数,语法如下:

    1. break n
    2. continue n

    break n表示跳出n层循环,continue n表示跳过n层循环,举例感受下: 

    1. #!/bin/bash
    2. for i in {1..6}
    3. do
    4. for j in {1..6}
    5. do
    6. if [ &j -eq 3 ]
    7. then
    8. break 2
    9. fi
    10. echo "$i $j"
    11. done
    12. done

    结果如下:

    eden_ubuntu@edenubuntu:~/Documents/Shell/5$ ./5-8.sh 
    1 1
    1 2

     小结

    本篇主要讲了Shell的循环结构,包括for,until,while,以及控制循环语句break和continue的用法

  • 相关阅读:
    08-Redis 【哨兵挂了,redis 还能正常工作吗?】
    Jenkins学习笔记
    自动驾驶数据标注有哪些?
    postgresql idle in transaction 进程如何杀死
    pandas reindex 方法
    三江学院“火焰杯”软件测试高校就业选拔赛颁奖仪式
    威纶通触摸屏与温控器进行MODBUS通信并通过宏指令将数据发送给PLC的具体方法
    QMediaPlaylist 类使用教程
    跨国企业扎根中国市场,应该选择什么样的云服务?
    Kafka 还是 MQ?我全都要,Java 中间件最详细学习资料 + 面试真题核心笔记,进阶架构师必备技能点
  • 原文地址:https://blog.csdn.net/MashiMaroJ/article/details/126014665