zoukankan      html  css  js  c++  java
  • bash循环

    bash脚本-循环02

     
    bash脚本编程:循环
    执行流程:
    1.顺序执行
    2.选择执行:if
    3.循环执行:for,while,until

    1.循环执行的条件

    进入条件:
    for:列表元素非空
    while:条件测试结果为“真”
    until:条件测试结果为“假”
     
    推出条件:
    for:列表元素遍历完成
    while:条件测试结果为“假”
    until:条件测试结果为“真”

    2.循环控制语句:continue,break,sleep

    2.1continue

    提前结束本轮循环,而直接进入下一轮循环判断
    1. while CONDITION1;do
    2. cmd1
    3. ...
    4. if condition2;then
    5. continue
    6. fi
    7. cmd2
    8. ...
    9. done
    例:求100以内所有偶数之和
    1. #/bin/bash
    2. #
    3. declare -i sum=0
    4. declare -i i=0
    5. while [ $i -le 100 ];do
    6. let i++
    7. if [ $[$i%2] -eq 1 ];then
    8. continue
    9. fi
    10. let sum+=$i
    11. done
    12. echo "sum is $sum"

    2.2 break

    提前跳出循环
    1. while CONDITION1;do
    2. CMD1
    3. if CONDITION2;then
    4. break
    5. fi
    6. done
    创建死循环
    1. while true;do
    2. 循环体
    3. done
    退出方式:某个测试条件满足之后,让循环体执行break命令
    例:求100以内所有奇数之和
    1. #!/bin/bash
    2. declare -i sum=0
    3. declare -i i=1
    4. while true;do
    5. let sum+=$i
    6. let i+=2
    7. if [ $i -gt 100 ];then
    8. break
    9. fi
    10. done
    11. echo "sum is $sum"
    2.3 sleep命令
    sleep-delay for a specified amount of time
    sleep NUMBER
    下面通过一个例子说明sleep的用法
    例:每隔3秒钟到系统上获取已经登录用户的用户的信息;其中,如果zhangpf用户登录了系统,则记录于日志中,并退出;
    方法1
    1. #!/bin/bash
    2. name=zhangpf
    3. until (who | grep "^$name>" &> /dev/null);do
    4. echo $?
    5. sleep 3
    6. done
    7. echo "$(date +"%F-%T") $name logged on" >> /tmp/sleep.log
    方法2
    1. #!/bin/bash
    2. name=zhangpf
    3. while true;do
    4. if who | grep "^$name>" &> /dev/null;then
    5. break
    6. fi
    7. sleep 3
    8. done
    9. echo "$(date +"%F-%T") $name logged on" >> /tmp/login.log

    3.循环体的特殊用法

    3.1 while循环的特殊用法(遍历文件的行)

    1. while read VARIABLE;do
    2. 循环体;
    3. done < /path/to/somefile
    4. #依次读取/path/to/somefile文件中的每一行,且将基赋值给VARIABLE变量;
    下面通过示例说明:
    示例:找出UID为偶数为的用户,显示其用户名、ID及默认shell
    1. #!/bin/bash
    2. while read line;do
    3. id=$(echo $line | cut -d: -f3)
    4. name=$(echo $line | cut -d: -f1)
    5. shell=$(echo $line | cut -d: -f7)
    6. if [ $[$id%2] -eq 1 ];then
    7. echo "$name,$id,$shell."
    8. fi
    9. done < /etc/passwd
    3.2 for的特殊用法:
    1. for ((控制变量初始化;条件判断表达式;控制变量的修正语句));do
    2. 循环体
    3. done
    控制变量初始化:仅在循环代码开始运行时执行一次
    控制变量的修正语句:每轮循环结束会先进行控制变量修正运算,而后再做条件判断
    示例:
    1. #!/bin/bash
    2. declare -i sum=0
    3. for ((i=0;i<=100;i++));do
    4. let sum+=$i
    5. done
    6. echo "sum=$sum"
    打印九九乘法表:
    1. #!/bin/bash
    2. for ((i=1;i<=9;i++));do
    3. for ((j=1;j<=i;j++));do
    4. echo -e -n "${i}X${j}=$[${i}*${j}] "
    5. done
    6. echo
    7. done

    4.bash语句之case语句

    case语句的语法格式:
    1. case $VARIABLE in
    2. PAT1)
    3. 分支1
    4. ;;
    5. PAT2)
    6. 分支2
    7. ;;
    8. 。。。。
    9. *)
    10. 分支n
    11. ;;
    12. esac
    case支持glob风格的通配符:
    *:任意长度的任意字符
    ?:任意单个字符
    []:范围内任意单个字符
    a|b:a或b
     
    示例:写一个服务框架脚本$lockfile,  值/var/lock/subsys/SCRIPT_NAME
                    (1) 此脚本可接受start, stop, restart, status四个参数之一;
                    (2) 如果参数非此四者,则提示使用帮助后退出;
                    (3) start,则创建lockfile,并显示启动;stop,则删除lockfile,并显示停止;restart,则先删除此文件再创建此文件,而后显示重启完成;status,如果lockfile存在,则显示running,否则,则显示为stopped.
    1. #!/bin/bash
    2. #version 0.0.1
    3. #author:zhangpf
    4. #date:2016.07
    5. #description:this just a test.
    6. #
    7. prog=$(basename $0)
    8. lockfile=/var/lock/subsys/$prog
    9. case $1 in
    10. start)
    11. if [ -f $lockfile ];then
    12. echo "$prog is running yet."
    13. else
    14. touch $lockfile
    15. [ $? -eq 0 ] && echo "start $prog finished."
    16. fi
    17. ;;
    18. stop)
    19. if [ -f $lockfile ];then
    20. rm -f $lockfile
    21. [ $? -eq 0 ] && echo "stop $prog is finished."
    22. else
    23. echo "$prog is not running."
    24. fi
    25. ;;
    26. restart)
    27. if [ -f $lockfile ];then
    28. rm -f $lockfile
    29. touch $lockfile
    30. echo "restart $prog finished."
    31. else
    32. touch -f $lockfile
    33. echo "start $prog finished."
    34. fi
    35. ;;
    36. status)
    37. if [ -f $lockfile ];then
    38. echo "$prog is running."
    39. else
    40. echo "$prog is stopped."
    41. fi
    42. ;;
    43. *)
    44. echo "Usage:$prog {start|stop|restart|status}"
    45. exit 1
    46. esac
  • 相关阅读:
    appium工作原理
    Python文件读写模式
    Redis info 参数详解
    MySQL show status 参数详解
    Monit : 开源监控工具介绍
    Ansible(三)
    Ansible(二)
    Ansible(一)
    使用python实现后台系统的JWT认证(转)
    微信公众号-5秒内不回复测试并处理方案,顺便复习php 时间执行
  • 原文地址:https://www.cnblogs.com/yczlove/p/7383950.html
Copyright © 2011-2022 走看看