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}]\t"
  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

bash循环的更多相关文章

  1. bash循环语句

    1  )单分支if语句 if 测试条件 :then 如果满足条件就执行这里的代码 f 2)双分支的if语句 if  测试条件:then 如果满足条件就执行这里的代码 else 如果不满足条件就执行这里 ...

  2. bash循环for/while/until

    shell流程控制之一:for循环     for VAR in LIST; do         STATEMENT1         ...     done         例:         ...

  3. Bash循环分类介绍

    方法一: #!/bin/bash ` do #code here echo $i done 方法二:C语言风格 #!/bin/bash ; i<=; i++)) do printf " ...

  4. bash循环得到日期目录

    #!/bin/bash today=$(date "+%Y%m%d") echo 'today is :'${today} single_input="raw_data/ ...

  5. bash脚本:集群资源争夺战crazy-killer

    背景 公司的集群很多人一起用,有时候就难免资源紧张,某次需要用的时候没资源等了半天还是没资源,再等半天还是没资源,于是就写了个脚本泄愤,建议看到的人拷走放在自己公司集群上长期运行 :) 实现 此脚本运 ...

  6. Bash 实例,第二部分

    我们先看一下处理命令行自变量的简单技巧,然后再看看 bash 基本编程结构. 接收自变量 在 介绍性文章 中的样本程序中,我们使用环境变量 "$1" 来引用第一个命令行自变量.类似 ...

  7. linux shell 报错 Syntax error: Bad for loop variable

    在linux下写了一个简单的shell,循环10次. test.sh #!/bin/bash ## ##循环10次 ## ; i<; i++)); do echo Good Morning ,t ...

  8. shell脚本练习题->1

    猜随机数的大小 描述: 写一个猜数字脚本,当用户输入的数字和预设数字(随机生成一个0-100的数字)一样时,直接退出,否则让用户一直输入:并且提示用户输入的数字比预设数字大或者小 分析: 1:随机数字 ...

  9. shell系统检测->

    系统状态检测脚本练习 1-> 查看磁盘状态 思路:查看磁盘/当前使用状态,如果使用率超过80%则报警发邮件 1.获取磁盘当前使用的值 df -h|grep /$ 2.从获取到的值中提取出,对应的 ...

随机推荐

  1. Qt信号槽第5个参数

    1.Qt::AutoConnection: 默认值,使用这个值则连接类型会在信号发送时决定.如果接收者和发送者在同一个线程,则自动使用Qt::DirectConnection类型.如果接收者和发送者不 ...

  2. mybatis原理分析学习记录,mybatis动态sql学习记录

    以下个人学习笔记,仅供参考,欢迎指正. MyBatis 是支持定制化 SQL.存储过程以及高级映射的持久层框架,其主要就完成2件事情: 封装JDBC操作 利用反射打通Java类与SQL语句之间的相互转 ...

  3. http压测工具wrk使用

    安装 wrk支持大多数类UNIX系统,不支持windows.需要操作系统支持LuaJIT和OpenSSL,不过不用担心,大多数类Unix系统都支持.安装wrk非常简单,只要从github上下载wrk源 ...

  4. HTTP请求8种方法

    HTTP/1.1协议中定义了八种方法(有时也叫“动作”)来表明Request-URI指定的资源的不同操作方式: OPTIONS 返回服务器针对特定资源所支持的HTTP请求方法.也可以利用向Web服务器 ...

  5. dp入门之01背包问题

    ...通过暴力手推得到的一点点感觉 动态规划是相对于贪心算法的一种取得最优解的算法,通过对每一步的取舍判断从 0 推到所拥有的第 n 件物品,每次判断可以列写出状态转移方程,通过记忆化相对暴力地取得最 ...

  6. hadoop配置项笔记 - hdfs

    hadoop版本:3.1.1 core-site.xml dfs.namenode.rpc-address 作用:rpc地址.我在使用distcp时显式使用到了. 默认值:port是8020 我的设置 ...

  7. aop(execution()表达式)

    execution(* com.tp.soft.service..*.*(..)) 整个表达式可以分为五个部分: 1.execution(): 表达式主体. 2.第一个*号:表示返回类型,*号表示所有 ...

  8. stylus入门学习笔记

    title: stylus入门学习笔记 date: 2018-09-06 17:35:28 tags: [stylus] description: 学习到 vue, 有人推荐使用 stylus 这个 ...

  9. curl的POST请求,封装方法

    //POST请求//参数1是请求的url//参数2是发送的数据的数组//参数3是其他POST选项public static function POST($url, array $post = arra ...

  10. pytorch使用总结

    loss的获取 在看别人代码的时候发现都是 loss=net.loss train_loss+=loss.data[0]#train_loss用于累加梯度 在想为什么不直接使用loss呢,因为pyto ...