• linux基础学习-19.6-Shell脚本-循环


    一、循环(for、while)

    1、循环语句语法

    1)while条件语句
    while 条件
        do
            指令
    done
    
    2)for循环结构语法
    for 变量名 in 变量取值列表
        do
            指令...
    done
    

    2、while语句

    休息命令:sleep 1 休息一秒,usleep 1000000休息1秒单位微妙

    1)守护进程

    [root@oldboy scripts]# cat oldboy.sh 
    #!/bin/bash
    while true
    do
        uptime >> /var/log/uptime.log
        sleep 2
    done
    

    #while true 表示条件永远为真,因此会一直运行,像死循环一样。

    [root@oldboy scripts]# cat /var/log/uptime.log 
     23:01:57 up  8:33,  2 users,  load average: 0.04, 0.03, 0.05
     23:01:59 up  8:33,  2 users,  load average: 0.04, 0.03, 0.05
     23:02:01 up  8:33,  2 users,  load average: 0.04, 0.03, 0.05
    

    2)从1加到100

    [root@oldboy scripts]# cat oldboy.sh 
    #!/bin/bash
    i=1
    sum=0
    while [ $i -lt 100 ]
    do
        ((sum=sum+i))
        ((i++))
    done
    echo $sum
    

    3)倒计时

    [root@oldboy scripts]# cat oldboy.sh 
    #!/bin/bash
    
    i=10
    while [ $i -gt 0 ]
    do
        echo $i
        sleep 1
        ((i--))
    done
    

    3、防止脚本执行中断的方法

    1)sh while01.sh & #放在后台执行

    2)screen 分离 ctrl+a+d 查看screen -ls进入screen -r num

    3)nohup while01.sh &

    4、for循环语句

    1)打印列表元素

    [root@oldboy scripts]# cat oldboy.sh 
    #!/bin/bash
    
    for i in 5 4 3 2 1   #用空格隔开
    do
        echo $i
    done
    [root@oldboy scripts]# sh oldboy.sh 
    5
    4
    3
    2
    1
    [root@oldboy scripts]# for i in {5..1};do echo $i;done
    5
    4
    3
    2
    1
    [root@oldboy scripts]# echo 10.1.1.{1..10}
    10.1.1.1 10.1.1.2 10.1.1.3 10.1.1.4 10.1.1.5 10.1.1.6 10.1.1.7 10.1.1.8 10.1.1.9 10.1.1.10
    [root@oldboy scripts]# for i in `seq 5 -1 1`;do echo $i;done
    5
    4
    3
    2
    1
    #循环执行命令n次
    [root@oldboy scripts]# for i in `seq 100`;do curl -I baidu.com;done
    

    2)开机启动项优化

    [root@oldboy scripts]# cat oldboy.sh 
    #!/bin/bash
    
    LANG=en
    for i in `chkconfig --list|grep "3:on"|awk '{print $1}'`
    do
        chkconfig $i off
    done
    
    for name in sshd rsyslog crond network sysstat
    do
        chkconfig $name on
    done
    

    3)在/oldboy目录批量创建文件

    [root@oldboy scripts]# cat oldboy.sh 
    #!/bin/bash
    Path=/oldboy
    [ -d "$Path" ] || mkdir -p $Path
    for i in `seq 10`
    do
        touch $Path/oldboy_$i.html
    done
    

    4)批量改名

    [root@oldboy scripts]# cat oldboy.sh 
    #!/bin/bash
    $Path=/oldboy
    [ -d "$Path" ] || mkdir -p $Path
    for file in `ls $Path`
    do
        mv $file `echo $file|sed -r 's#oldboy(.*).html#linux1.HTML#g'`
    done
    

    5)批量创建用户并设置密码

    [root@oldboy scripts]# cat oldboy.sh 
    #!/bin/bash
    
    User=oldboy
    Path=/tmp
    
    for user in ${User}{01..10}
    do
        useradd $user >/dev/null 2>&1
        if [ ! $? -eq 0 ];then
            echo "$user created faile!"
            echo "scripts begin to rollback!"
            for i in ${User}{01..10}
            do
                userdel -r $i >/dev/null 2>&1
                [ $? -eq 0 ] || exit 1
            done
            echo >$Path/user_passwd
            exit 1
        else
            passWD=`echo $RANDOM|md5sum|cut -c1-8`
            [ -d $Path ] || mkdir $Path
            echo $passWD | passwd --stdin $user
            echo "$user:$passWD">>$Path/user_passwd
        fi
    done
    

    6)获取当前目录下的目录名做为变量列表打印输出

    [root@oldboy ~]# cat /server/scripts/oldboy.sh
    #!/bin/bash
    
    Path=`pwd`
    echo $Path
    for filename in `ls`
    do
        [ -d ${Path}/${filename} ] && echo $filename
    done
    

    7)九九乘法表

    [root@oldboy ~]# cat /server/scripts/oldboy.sh 
    #!/bin/bash
    
    for ((i=1;i<10;i++))
    do
        for ((j=1;j<=i;j++))
        do
            echo -n "$i * $j = $((i*j))"
            echo -n " "
        done
        echo " "
    done
    [root@oldboy ~]# sh /server/scripts/oldboy.sh
    1 * 1 = 1  
    2 * 1 = 2 2 * 2 = 4  
    3 * 1 = 3 3 * 2 = 6 3 * 3 = 9  
    4 * 1 = 4 4 * 2 = 8 4 * 3 = 12 4 * 4 = 16  
    5 * 1 = 5 5 * 2 = 10 5 * 3 = 15 5 * 4 = 20 5 * 5 = 25  
    6 * 1 = 6 6 * 2 = 12 6 * 3 = 18 6 * 4 = 24 6 * 5 = 30 6 * 6 = 36  
    7 * 1 = 7 7 * 2 = 14 7 * 3 = 21 7 * 4 = 28 7 * 5 = 35 7 * 6 = 42 7 * 7 = 49  
    8 * 1 = 8 8 * 2 = 16 8 * 3 = 24 8 * 4 = 32 8 * 5 = 40 8 * 6 = 48 8 * 7 = 56 8 * 8 = 64  
    9 * 1 = 9 9 * 2 = 18 9 * 3 = 27 9 * 4 = 36 9 * 5 = 45 9 * 6 = 54 9 * 7 = 63 9 * 8 = 72 9 * 9 = 81
    

    5、各种语句小结

    1)while循环的特长是执行守护进程以及我们希望循环不退出持续执行,用于频率小于1分钟循环处理(crond),其他的while循环几乎都可以被for循环替代。

    2)case语句可以被if语句替换,一般在系统启动脚本传入少量固定规则字符串用case语句,其他普通判断多用if

    3)一句话,if,for语句最常用,其次while(守护进程),case(服务启动脚本)

    6、获取随机数的几种方法

    1)通过系统环境变量$RANDOM

    [root@oldboy ~]# echo $RANDOM
    6178
    [root@oldboy ~]# echo $RANDOM
    30890
    [root@oldboy ~]# echo $((RANDOM%9)) #输出0~9之间随机数
    2
    [root@oldboy ~]# echo $((RANDOM%9)) 
    [root@oldboy ~]# echo $((RANDOM%9))$((RANDOM%9)) #输出00~99 随机数
    64
    [root@oldboy ~]# echo $((RANDOM%9))$((RANDOM%9)) #输出00~99岁?随机数
    10
    [root@oldboy ~]# echo $((RANDOM%9))$((RANDOM%9)) #输出00~99岁?随机数
    51
    [root@oldboy ~]# echo $RANDOM|md5sum #随机数长短不一,可以用md5sum命令统一格式化
    599e328a94329684ce5c92b850d32f26  -
    

    2)通过openssl产生

    [root@oldboy ~]# openssl rand -base64 8
    aND8WMRM6vQ=
    [root@oldboy ~]# openssl rand -base64 8
    RsRdRq/9vi4=
    [root@oldboy ~]# openssl rand -base64 8|md5sum
    b1108cafbc2291392e41d2c914360138  -
    [root@oldboy ~]# openssl rand -base64 10      
    1frkA2kIJODxqQ==
    

    3)通过时间获得随机数

    [root@oldboy ~]# echo $(date +%N)
    361599138
    [root@oldboy ~]# echo $(date +%N)
    199271856
    [root@oldboy ~]# echo $(date +%t%N)
    950526316
    [root@oldboy ~]# echo $(date +%t%N)
    340140329
    

    4)urandom

    [root@oldboy ~]# head /dev/urandom | cksum
    621330951 2535
    [root@oldboy ~]# head /dev/urandom | cksum
    404398617 2470
    

    5)UUID

    [root@oldboy ~]# cat /proc/sys/kernel/random/uuid
    8a6c5bbe-2d42-44ac-9ef1-3e7683a613e3
    [root@oldboy ~]# cat /proc/sys/kernel/random/uuid
    c828c209-5b5f-4bc7-917c-678ed4215988
    [root@oldboy ~]# uuidgen
    961dc354-81b2-4564-9b85-6095ed4bc7b5
    

    7、循环中的四个关键词 break continue exit return

    break continue exit用于循环结构中控制虚幻(for,while,if)的走向
    1)break
    [root@oldboy ~]# cat /server/scripts/oldboy.sh
    #!/bin/bash
    
    for ((i=0;i<=5;i++))
    do
        [ $i -eq 3 ] && break
        echo $i
    done
    echo "ok"
    [root@oldboy ~]# sh /server/scripts/oldboy.sh
    0
    1
    2
    ok
    

    2)continue

    [root@oldboy ~]# cat /server/scripts/oldboy.sh
    #!/bin/bash
    
    for ((i=0;i<=5;i++))
    do
        [ $i -eq 3 ] && continue
        echo $i
    done
    echo "ok"
    [root@oldboy ~]# sh /server/scripts/oldboy.sh
    0
    1
    2
    4
    5
    ok
    

    3)exit

    [root@oldboy ~]# cat /server/scripts/oldboy.sh
    #!/bin/bash
    
    for ((i=0;i<=5;i++))
    do
        [ $i -eq 3 ] && exit 2
        echo $i
    done
    echo "ok"
    [root@oldboy ~]# sh /server/scripts/oldboy.sh
    0
    1
    2
    [root@oldboy ~]# echo $?
    2
    

    4)return

    [root@oldboy ~]# cat /server/scripts/oldboy.sh
    #!/bin/bash
    
    function xxxx {
    
        for ((i=0;i<=5;i++))
        do
            [ $i -eq 3 ] && return 7
            echo $i
        done
        echo "ok"
    
    }
    
    xxxx
    echo $?
    [root@oldboy ~]# sh /server/scripts/oldboy.sh
    0
    1
    2
    7
    

    练习题:

    1、while的基本语法

    2、for的基本语法

    3、防止脚本中断的方法

    4、解释下循环中的四个关键词 break continue exit return

  • 相关阅读:
    相似矩阵
    特征值和特征向量
    非齐次方程组的通解
    线性方程组解的性质和结构、基础解系
    高斯消元法求齐次线性方程的通解
    从零开始学 Web 之 HTML(三)表单
    从零开始学Web之HTML(二)标签、超链接、特殊符号、列表、音乐、滚动、head等
    从零开始学 Web 之 HTML(一)认识前端
    JavaScript基础(一)概述
    如何恢复windows的exe文件的默认打开方式
  • 原文地址:https://www.cnblogs.com/Klanti/p/9143813.html
Copyright © 2020-2023  润新知