• shell之循环


    一、for循环语句

    1.1 for循环语句结构

    1)列表循环

    列表for循环:用于将一组命令执行已知的次数!

    语法结构:

    for variable in {list}
         do
              command 
              command
              …
         done
    

    或者

    for variable in a b c
         do
             command
             command
         done
    

    举例说明:

    # for var in {1..10};do echo $var;done
    # for var in 1 2 3 4 5;do echo $var;done
    # for var in `seq 10`;do echo $var;done
    # for var in $(seq 10);do echo $var;done
    # for var in {0..10..2};do echo $var;done
    # for var in {2..10..2};do echo $var;done
    # for var in {10..1};do echo $var;done
    # for var in {10..1..-2};do echo $var;done
    # for var in `seq 10 -2 1`;do echo $var;done
    
    2)不带列表循环

    不带列表的for循环:执行时由用户指定参数和参数的个数!

    语法结构:

    for variable
        do
            command 
            command
            …
       done
    

    举例说明:

    #!/bin/bash
    for var
    do
    echo $var
    done
    
    echo "脚本后面有$#个参数"
    
    3)类C风格的for循环

    基本语法:

    for(( expr1;expr2;expr3 ))
        do
            command
            command
            …
        done
    
    expr1:定义变量并赋初值
    expr2:决定是否进行循环(条件)
    expr3:决定循环变量如何改变,决定循环什么时候退出
    

    举例说明:

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

    2.2 应用示例

    1)脚本计算1~100的奇数的和
    #!/bin/bash
    
    # 定义变量来保存奇数和
    sum=0
    
    #for循环遍历1-100的奇数,并且相加,把结果重新赋值给sum
    for i in {1..100..2}
    do
        let sum=$sum+$i
    done
    #打印所有奇数的和
    echo "1-100的奇数和是:$sum"
    

    控制循环语句的参数:

    • continue:继续;表示循环体内的代码不再执行,直接开始下一次循环;
    • break:打断;马上停止执行本次循环,执行循环体后的代码;
    • exit:表示直接跳出程序;
    #!/bin/bash
    for i in {1..5}
    do
        test $i -eq 2 && break || touch /tmp/file$i
    done
    #当脚本等于2时,停止循环,脚本结束
    
    2)批量创建用户

    批量加5个新用户,以u1到u5命名,并统一加一个新组,组名为class,统一改密码为123 !

    #!/bin/bash
    #判断class组是否存在
    grep -w class /etc/group &>/dev/null
    [ $? -ne 0 ] && groupadd class
    #批量创建5个用户
    for i in {1..5}
    do
        useradd -G class u$i
        echo 123|passwd --stdin u$i
    done
    

    批量新建5个用户stu1~stu5,要求这几个用户的家目录都在/rhome !

    #!/bin/bash
    #判断/rhome是否存在
    [ -f /rhome ] && mv /rhome /rhome.bak
    test ! -f /rhome -a ! -d /rhome && mkdir /rhome
    #创建用户,循环5次
    for ((i=1;i<=5;i++))
    do
        useradd -d /rhome/stu$i stu$i
        echo 123|passwd --stdin stu$i
    done
    
    3)局域网网内脚本检查网络是否可以正常通信

    写一个脚本,局域网内,把能ping通的IP和不能ping通的IP分类,并保存到两个文本文件里!

    #!/bin/bash
    #定义变量
    ip=10.1.1
    #循环去ping主机的IP
    for ((i=1;i<=254;i++))
    do
        ping -c1 $ip.$i &>/dev/null
        if [ $? -eq 0 ];then
            echo "$ip.$i is ok" >> /tmp/ip_up.txt
        else
            echo "$ip.$i is down" >> /tmp/ip_down.txt
        fi
    done	
    

    shell脚本并行处理:

    并行执行:
    {程序}&表示将程序放到后台并行执行,如果需要等待程序执行完毕再进行下面内容,需要加wait

    #!/bin/bash
    #定义变量
    ip=10.1.1
    #循环去ping主机的IP
    for ((i=1;i<=254;i++))
    do
    {
    
            ping -c1 $ip.$i &>/dev/null
            if [ $? -eq 0 ];then
                    echo "$ip.$i is ok" >> /tmp/ip_up.txt
            else
                    echo "$ip.$i is down" >> /tmp/ip_down.txt
            fi
    }&
    done
    wait
    echo "ip is ok...."
    
    4)判断闰年

    输入一个年份,判断是否是润年(能被4整除但不能被100整除,或能被400整除的年份即为闰年)!

    #!/bin/bash
    read -p "Please input year:" year
    if [ $[$year%4] -eq 0 -a $[$year%100] -ne 0 ];then
        echo "$year is leap year"
    elif [ $[$year%400] -eq 0 ];then
        echo "$year is leap year"
    else
        echo "$year is not leap year"
    fi
    

    二、while循环语句

    while循环语句的特点:条件为真就进入循环,条件为假就退出循环!

    2.1 while循环语法结构

    while 表达式
    do
            command...
    done
    

    或者

    while  [ 1 -eq 1 ] 或者 (( 1 > 2 ))
    do
         command
         command
         ...
    done
    

    循环打印1~5数字

    #for循环打印
    for ((i=1;i<=5;i++))
    do
        echo $i
    done
    #while循环打印
    i=1
    while [ $i -le 5 ]
    do
        echo $i
        let i++
    done
    

    2.2 应用示例

    1)计算1~50偶数的和
    #!/bin/bash
    #定义变量
    sum=0
    i=2
    #循环打印1-50的偶数和并且计算后重新赋值给sum
    while [ $i -le 50 ]
    do
        let sum=sum+i
        let i+=2
    done
    #打印sum的值
    echo "1-50的偶数和为:$sum"
    
    2)脚本同步系统时间
    #!/bin/bash
    #定义变量
    count=0
    ntp_server=10.1.1.1
    while true
    do
        rdate -s $ntp-server &>/dev/null
        if [ $? -ne 0 ];then
            echo "system date failed" |mail -s 'check system date'  root@localhost  
        else
            let count++
            if [ $[$count%100] -eq 0 ];then
            echo "system date successfull" |mail -s 'check system date'  root@localhost && count=0
            fi
        fi
    sleep 3
    done
    

    三、until循环

    until循环特点:条件为假进入循环,条件为真退出循环!

    3.1 until循环语句结构

    until 表达式
    do
            command
            command
            ...
    done
    

    循环打印1~5数字

    #while循环打印
    i=1
    while [ $i -le 5 ]
    do
        echo $i
        let i++
    done
    #until循环打印
    i=1
    until [ $i -gt 5 ]
    do
        echo $i
        let i++
    done
    

    3.2 应用示例

    1)使用until语句批量创建10个用户,要求stu1—stu5用户的UID分别为1001—1005;
    2)stu6~stu10用户的家目录分别在/rhome/stu6—/rhome/stu10

    #!/bin/bash
    i=1
    until [ $i -gt 10 ]
    do
        if [ $i -le 5 ];then
            useradd -u $[1000+$i] stu$i && echo 123|passwd --stdin stu$i
        else
            [ ! -d /rhome ] && mkdir /rhome
            useradd -d /rhome/stu$i stu$i && echo 123|passwd --stdin stu$i      
        fi
    let i++
    done
    
    *************** 当你发现自己的才华撑不起野心时,就请安静下来学习吧!***************
  • 相关阅读:
    spring mvc 数据格式化
    spring mvc 数据转换
    spring mvc
    spring
    java+hibernate+mysql
    Jenkins使用TFS部署
    Docker基本命令
    MySQL主从配置
    Jenkins邮箱设置
    vlc 控件属性和方法
  • 原文地址:https://www.cnblogs.com/lvzhenjiang/p/14199078.html
Copyright © 2020-2023  润新知