• shell编程之循环


    shell编程之循环

    1.while循环

    循环语句命令常用于重复执行一条指或一组命令,直到条件不满足停止,shell脚本语方的循环语句常见的有while,until,for以及select循环语句,while循环语句主要用来重复执行一组命令或语句,在企业实际应用中,常用于守护进程或持续运行的程序
    

    1.1 while循环语法

    while <条件表达式>
    do
        指令...
    done
    

    1.2 while循环参

    用法 说明
    sh while1.sh & 把脚本while1.sh放到后台执行(后台运行脚本时常用)
    nohup while1.sh & 使用nohup把脚本while1.sh放到后台执行
    ctl+c 停止执行当前脚本或任务
    ctl+z 暂停执行当前脚本或任务
    bg 把当前脚本或任务放到后台执行,bg可以理解为background
    fg 把当前脚本或任务拿到前台执行,如果有多个任务,可以使用fg加任务编号调出对应脚本任务,如fg 2,调出第二个脚本任务,fg可以理解为frontground
    jobs 查看当前执行的脚本或任务
    kill 关闭执行的脚本任务,即以“kill %任务编号”的形式关闭脚本,这个任务编号,可以通过jobs获得 t-lang

    kill、killall、pkill:杀掉进程。
    ps:查看进程。
    pstree:显示进程状态树。
    top:显示进程。
    renice:改变优先权。
    nohup:用户退出系统之后继续工作。
    pgrep:查找匹配条件的进程。
    strace:跟踪一个进程的系统调用情况。
    ltrace:跟踪进程调用库函数的情况。

    1.3 while循环读取文件方法

    方法一:在while循环结尾done通过输入重定向指定读取的文件。
    while read line
    do
        cmd
    done<FILE
    方法二:使用cat读取文件内容,然后通过管道进入while循环处理
    cat FILE_PATH|while read line
    do
        cmd
    done
    方法三:采用exec读取文件后,然后进入while循环处理
    exec <FILE
    sum=0
    while read line
    do
        cmd
    done
    

    2 while循环案例

    2.1 每隔2秒输出一次系统负载(负载是系统性能的基础重要指标)情况。

    while true
    do
        uptime >> /tmp/uptime.log
        sleep 1                                                                                        
    done
    

    2.2 猜数字游戏。首先让系统随机生成一个数字,给这个数字定一个范围(1-60),让用户输入猜的数字,对输入进行判断,如果不符合要求,就给予高或低的提示,猜对后则给出猜对用的次数,请用while语句实现

    [root@ci-node1 while]# cat 2.sh 
    #!/bin/bash
    ##############################################################
    # File Name: 2.sh
    # Version: V1.0
    # Author: liu
    # Organization: 
    # Created Time : 2019-04-14 00:43:17
    # Description:
    ##############################################################
    random="$((RANDOM%60))"
    count=0
    while true
    do
        ((count++))
        read -p "请猜数字:" num
        if [ $num -gt $random ]
        then
            echo "猜高了。"
        elif [ $num -eq $random ]
        then
            echo "牛啊,猜对了,一共猜了${count}次。"
            exit
        else
            echo "猜低了。"
        fi
    done
    

    2.3 分析Apache访问日志(access_2010-12-8.log),把日志中每行的访问字节数对应字段数字相加,计算出总的访问量。给出实现程序,请用while循环实现

    [root@ci-node1 while]# cat 3.sh 
    #!/bin/bash
    ##############################################################
    # File Name: 3.sh
    # Version: V1.0
    # Author: liu
    # Organization: 
    # Created Time : 2019-04-14 13:15:03
    # Description:
    ##############################################################
    sum=0
    awk '{print $10}' access_2010-12-8.log|grep -v - >/tmp/oldboy.log
    while read line
    do
        ((sum+=line))
    done</tmp/oldboy.log
    echo $sum
    

    3.for循环

    for循环语句和while循环语句类似,但for循环语句主要用于执行次数有限的循环,而不是用于守护进程以及无限循环
    

    3.1 for循环语法

    1)普通语法
    for 变量名 in 变量取值列表
    do
        指令...
    done
    2)C语言型for循环语法
    for((exp1;exp2;exp3))
    do
        指令...
    done
    

    3.2 for循环案例

    3.2.1 用for循环竖向打印1、2、3、4、5共5个数字。

    [root@ci-node1 while]# cat 4.sh 
    #!/bin/bash
    ##############################################################
    # File Name: 4.sh
    # Version: V1.0
    # Author: liu
    # Organization: 
    # Created Time : 2019-04-14 14:11:20
    # Description:
    ##############################################################
    for i in 1 2 3 4 5
    do
        echo $i
    done
    

    3.2.2 通过开发脚本实现仅设置sshd rsyslog crond network sysstat****服务开机自启动

    for name in sshd rsyslog crond network sysstat
    do
        systemctl enable $name
    done   
    

    3.2.3 计算从1加到100之和

    [root@ci-node1 while]# cat 6.sh 
    #!/bin/bash
    ##############################################################
    # File Name: 6.sh
    # Version: V1.0
    # Author: liu
    # Organization: 
    # Created Time : 2019-04-14 14:42:17
    # Description:
    ##############################################################
    sum=0
    for num in {1..100}
    do
        ((sum+=num))
    done
    echo $sum
    echo --------------------------
    for ((i=1;i<=1000000;i++))
    do
        ((sum1+=i))
    done
    echo $sum1
    

    3.2.4 在Linux下批量修改文件名,将文件名中的“_finished”去掉

    准备测试数据,如下:

    [root@ci-node1 scripts]# mkdir /oldboy -p
    [root@ci-node1 scripts]# cd /oldboy/
    [root@ci-node1 oldboy]# touch stu_102999_1_finished.jpg stu_102999_2_finished.jpg stu_102999_3_fini
    shed.jpg[root@ci-node1 oldboy]# touch stu_102999_4_finished.jpg stu_102999_5_finished.jpg
    [root@ci-node1 oldboy]# 
    

    脚本:

    [root@ci-node1 while]# cat 7.sh 
    #!/bin/bash
    ##############################################################
    # File Name: 7.sh
    # Version: V1.0
    # Author: liu
    # Organization: 
    # Created Time : 2019-04-14 14:59:21
    # Description:
    ##############################################################
    for file in `ls /oldboy/*.jpg`
    do
        mv $file `echo ${file/_finished/}`
    done
    方法二:rename "_finished" "" *.jpg
    方法三:ls *.jpg|awk -F "_finished" '{print "mv",$0,$1$2}'|sh
    

    4.循环控制及状态返回值应用实践

    4.1 break、continue、exit、return的区别和对比

    break、continue在条件语句及循环语句(for、while、if等)中用于控制程序的走向,而exit则用于终止所有语句并退出当前脚本,除此之外,exit还可以返回上一次程序或命令的执行状态值给当前Shell;return类似exit,只不过return仅用于在函数内部返回函数执行的状态值
    

    条件与循环控制及程序返回值命令知识表格

    命令 说明
    break n 如果省略n表示跳出整个循环,n 表示跳出循环的层数
    continue n 如果省略n表示跳过本次循环,忽略本次循环的剩余代码,进入循环的下一次循环。n 表示退到第n层继续循环
    exit n 退出当前shell程序,n为上一次程序执行的状态返回值。n也可以省略,再下一个shell里可通过$?接收exit n的n值
    return n 用于在函数里,作为函数的返回值,用于判断函数执行是否正确。再下一个shell里可通过$?接收exit n的n值
  • 相关阅读:
    算法 quick sort
    非常多学ThinkPHP的新手会遇到的问题
    原创jQuery插件之图片自适应
    管理线程之向线程函数传递參数
    [LeetCode]94.Binary Tree Inorder Traversal
    数据库基本概念
    Eclipse4.4 安装java反编译插件Eclipse Class Decompiler
    广义线性模型
    代理模式
    多态之中的一个(继承和虚函数)
  • 原文地址:https://www.cnblogs.com/yjiu1990/p/10748233.html
Copyright © 2020-2023  润新知