• shell的for循环与结构化


    shell 的 for 循环

    (1)概述

    for 循环是 shell 中常用的循环控制结构,用于重复执行一段代码。for 循环的语法如下:

    for variablein list	#每一次循环,依次把列表list 中的一个值赋给循环变量
    do					#循环体开始的标志
    	commands		#循环变量每取一次值,循环体就执行一遍commands
    done				#循环结束的标志,返回循环顶部
    
    
    • 1
    • 2
    • 3
    • 4
    • 5

    其中:

    • variable 是循环变量,每次循环会从 list 中取出一个值赋给 variable。
    • list 是循环的对象,可以是字符串、文件名、数字序列等。
    • commands 是循环体,循环会重复执行 commands 指定的代码。

    (2)列表 for 循环

    列表 for 循环是 for 循环最常见的一种形式,list 可以是字符串、文件名、数字序列等。

    例1:输出当前目录下的所有文件
    #!/bin/bash
    
    for file in *
    do
        echo "$file"
    done
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    例2:读取/etc/passwd文件,获取用户名
    #!/bin/bash
    
    for username in `awk -F: '{print $1}' /etc/passwd`
    do
        echo "$username"
    done
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    该脚本的输出结果如下:

    root
    daemon
    bin
    sys
    sync
    ...
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    (3)不带列表的 for 循环

    不带列表的 for 循环是指循环变量 variable 的值由命令行参数指定。

    例1:输出命令行参数
    #!/bin/bash
    
    for arg
    do
        echo "$arg"
    done
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    例2:监控主机存活

    可以ping整个网段,并返回格式为时间、IP地址和在线情况(down或up):

    #!/bin/bash  
    
    for ip in 192.168.31.{1..255}
    do
        ping -c2 "$ip" &>/dev/null
        if [ $? -eq 0 ]; then
            echo -e " $(date +%F-%H:%M:%S) $ip \033[032m up \033[0m"  
        else
            echo -e " $(date +%F-%H:%M:%S) $ip \033[031m down \033[0m"  
        fi
    done
    sleep 5
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    输出:

    [root@localhost shell]# sh ping.sh  
     2023-12-02-16:32:03 192.168.31.1  up 
     2023-12-02-16:32:06 192.168.31.2  down 
     2023-12-02-16:32:09 192.168.31.3  down 
     2023-12-02-16:32:12 192.168.31.4  down 
     2023-12-02-16:32:15 192.168.31.5  down 
     。。。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    (4)break 和 continue

    break 和 continue 是 shell 中用于控制 for 循环的两个关键字。

    • break 用于强行退出当前循环。
    • continue 用于忽略本次循环的剩余部分,回到循环的顶部,继续下一次循环。
    例1:使用 break 退出循环
    #!/bin/bash
    
    i=1
    for day in Mon Tue Wed Thu Fri
    do
        echo "Weekday $((i++)) : $day"
        if [ $i -eq 3 ]; then
            break
        fi
    done
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    例2:使用 continue 跳过周末
    #!/bin/bash
    
    i=1
    for day in Mon Tue Wed Thu Fri Sat Sun
    do
        echo -n "Day $((i++)) : $day"
        if [ $i -eq 7 -o $i -eq 8 ]; then
            echo "(WEEKEND)"
            continue
        fi
        echo "(weekday)"
    done
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    (5)类C语言for循环

    shell 的类 C 语言 for 语法与 C 语言的 for 语法相似,都是用于重复执行一段代码的结构。shell 的类 C 语言 for 语法的语法如下:

    for (( variable = start; condition; increment ))
    do
        commands
    done
    
    • 1
    • 2
    • 3
    • 4

    其中:

    • variable 是循环变量,每次循环会从 start 的值开始,根据 condition 的判断进行循环。
    • start 是循环变量的初始值。
    • condition 是循环的条件,如果条件为真,则继续循环,否则退出循环。
    • increment 是循环变量的步进值,每次循环后,循环变量会增加 increment 的值。

    演示示例

    1. 10秒倒计时

    #!/bin/bash
    
    echo "10秒倒计时:"
    echo
    
    for (( i=10; i>0; i-- ))
    do
        echo $i
        sleep 1
    done
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    该脚本输出:

    10秒倒计时:
    
    10
    9
    8
    7
    6
    5
    4
    3
    2
    1
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • for 循环也可以嵌套使用,即在 for 循环中嵌套另一个 for 循环。
    • for 循环还可以使用 range 函数,range 函数可以生成一个数字序列。

    shell 的类 C 语言 for 语法可以简化 for 循环的语法,使其更加接近 C 语言的语法。在实际使用中,可以根据实际情况选择合适的语法。

  • 相关阅读:
    计算机毕业设计Javaweb高校车辆调度系统设计与实现(源码+系统+mysql数据库+lw文档)
    学习笔记8--智能驾驶的功能安全设计之功能安全与ISO 26262标准
    paddle 45 使用paddledetection做旋转框预测(预测自己的dota数据集)
    面试前必须了解的7 种架构设计模式(译文)
    基于树莓派CM4制作img系统镜像&批量制作TF卡
    Jmeter做接口测试
    LLVM IR 构建 分析 转换 优化 IRBuilder Pass AI编译器后端代码生成
    leetcode 12. Integer to Roman(整数转罗马数字)
    启动 React APP 后经历了哪些过程
    【Camera Sensor Driver笔记】二、点亮指南之Sensor Module XML
  • 原文地址:https://blog.csdn.net/qq_39689711/article/details/133970453