shell流程控制之一:for循环
    for VAR in LIST; do
        STATEMENT1
        ...
    done
   
    例:
        for i in {0..5}; do
            echo $i
        done
   
    循环次数: 为列表中的元素的个数
    LIST: 列表,包含至少一个元素的字符串集合
        1) 直接给出
            例:
                for  i in lian shu; do
                    echo $1
                done
                    第一次打印lian,第二次打印shu
        2) 数值列表:{start..end}, 例: {1..10}
                `seq LAST`
                `seq FIRST LAST`
                `seq FIRST STEP LAST`
                例:    for i in `seq 5`; do
                        echo $i
                    done
                        依次打印数字1-5
                   
                    for i in `seq 5 10`; do
                        echo $i
                    done
                        依次打印数字5-10
                   
                    for i in `seq 5 2 10`; do
                        echo $i
                    done
                        依次打印数字5,7,9
        3) 返回列表的命令
            例:
                #!/bin/bash
                for i in `cat /etc/passwd` ;do
                    echo $i
                done
               
                #!/bin/bash
                for i in `ls /etc/` ;do
                    echo $i
                done
               
        4) globbing
            例:
                #!/bin/bash
                for i in /tmp/aa* ;do
                    echo $i
                done
                    文件名通配
                   
        5) 变量引用
            $*: 文件的参数列表
            $@:文件的参数个数
           
            例:
                #!/bin/bash
                for i in $* ;do
                    echo $i
                done
                    文件名通配
       
   
    睡眠: sleep #: #代表数字
   
        例如:添加3个用户,user1, user2, user3; 密码同用户名;
            #!/bin/bash
           
            for i in {1..3}; do
                if useradd user$i &> /dev/null ; then
                    echo "user$i" | passwd --stdin user$i
                    echo "Success to add user$i"
                else
                    echo "Fail to add user$i"
                fi
            done
           
        练习1:于/tmp/test目录中创建10个空文件f1,.., f10;
            #!/bin/bash
            for i in {1..10} ;do
                touch f$i
            done
           
        练习2:求100以内所有正整数之和;
            #!/bin/bash
            let sum=0
            for i in {1..100} ;do
                let sum=sum+$1
            done
            echo "sum=$sum"
        练习3:求100以内所有偶数之和;以及所有奇数之和;
        练习4:计算当前系统上所有用户ID之和;
        练习5:显示当前系统所有默认shell为bash的用户的总数;并统计此些用户ID之和;

练习:写一个脚本
            使用ping命令探测192.168.0.X主机的在线状态
            ping -w 2 192.168.0.2
                -w #:是尝试ping几次,之后会结束,否则会一直ping
            X在此处代表的是1-254
           
            #!/bin/bash
            for i in {1..254}; do
                if ping -w 2 192.168.0.$i &> /dev/null ;then
                    echo "192.168.0.$i is online."
                else
                    echo "192.168.0.$i is offline."
                fi
            done
   
    for几种特殊情况
        1) for省略,会自动获取脚本参数列表
        2) C编程风格
            for ((变量赋值;循环条件;修正表达式)); do
                CMD1
                CMD2
            done
        3)循环嵌套
            for i in [LIST1];do
                CMD1
                for j in [LIST2];do
                    CMD2
                done
            done
        练习:写一个脚本    X  0-255   Y 1-254
            (1) ping 172.16.X.Y内的所有主机;
                172.16.0-255.1-254

for i in {0..255}; do
                for j in {1..254}; do
                    ping -c1 -w1 172.16.$i.$j
                done
            done

练习2:写个脚本
            (1) 传递一些目录给脚本;
            (2) 逐个显示每个目录下的所有一级文件的内容类型;
            (3) 统计一个有多少个目录;一共显示了多少个文件;

#!/bin/bash
            #
            declare -i dirs=0
            declare -i files=0

for d in $*; do
                for f in $d/*; do
                    file $f
                    let files++
                done
                let dirs++
            done

echo "Directories: $dirs."
            echo "Files: $files."       
   
    bash中产生伪随机数:$RANDOM
        0-32767
       
        练习1:生成10个随机数,返回其最大值
            #!/bin/bash
            declare -i max=0
           
            for i in {1..10};do
                random=$RANDOM
                LIST="$LIST $random"
                if [ $random -ge $max ];then
                    max=$random
                fi
            done
           
            echo "List Number:$LIST"
            echo " Max Number:$max"
           
        练习1:使用for循环,打印九九乘法表
                #!/bin/bash
                #
                for i in {1..9}; do
                    for j in `seq 1 $i`; do
                        echo -n -e "${j}x${i}=$[$i*$j]\t"
                    done
                    echo
                done

练习2:写一个脚本,判断给定的用户是否登录了当前系统;
            (1) 如果登录了,则脚本终止;
            (2) 每5秒种,查看一次用户是否登录;

while循环和函数
    while CONDITION; do
        循环体
        循环控制变量的修正表达式
    done
   
    当CONDITON为真,进入循环体,直到假时退出

练习1:计算100以内所有偶数之和
        #!/bin/bash
        declare -i i=1
        declare -i evensum=0
       
        while [ $i -le 100 ];do
            if [ $[$i%2] -eq 0 ];do
                let evensum+=$i
            fi
            let i++
        done
        echo "evensum=$evensum"
   
until循环:
    until CONDITION;do
        循环体
        循环控制变量修正表达式
    done
   
    当CONDITON为假时进入循环,为真时退出
   
    练习1:计算100以内所有偶数之和
        #!/bin/bash
        declare -i i=1
        declare -i evensum=0
       
        until [ $i -gt 100 ];do
            if [ $[$i%2] -eq 0 ];do
                let evensum+=$i
            fi
            let i++
        done
        echo "evensum=$evensum"
   
    练习2:分别使用while和until循环实现添加10个用户:myuser1-myuser10
            #!/bin/bash
            #
            declare -i i=1
            declare -i j=0

until [ $i -gt 10 ]; do
                if ! id myuser$i &> /dev/null; then
                useradd myuser$i
                    let j++
                fi
                let i++
            done

echo "Add users [total]: $j."   
           
    练习3:打印九九乘法表,要求内外层循环分别使用while或until;
    练习4:打印倒序的九九乘法表,要求内外层循环分别使用while或until;

循环控制命令:
        break: 提前退出循环
            break N: 退出N层循环,N省略时表示退出break语句所在的循环
        continue: 提前结束本轮循环,而直接进入下轮循环
            continue N: 提前结束第N层循环的本轮循环,而直接进入下轮循环
       
        while CONDITION; do
            CMD1
            if CONDITION2; then
                break [N]
            fi
            CMD2
            ...
        done
       
        死循环:
            while true;do
                循环体
            done
           
            until false; do
                循环体
            done
           
            练习2:写一个脚本,判断给定的用户是否登录了当前系统;
            (1) 如果登录了,则脚本终止;
            (2) 每5秒种,查看一次用户是否登录;

方法一:
            #!/bin/bash
            #
            declare -i status=0

#显示当年有哪些用户登录
            who | grep "centos" &> /dev/null
            status=$?

until [ $status -eq 0 ]; do
                sleep 5
                who | grep "centos" &> /dev/null
                status=$?
            done

echo "centos is logged on."

方法二
            #!/bin/bash
            #
            declare -i status=0

until who | grep "centos" &> /dev/null; do
                sleep 5
            done

echo "centos is logged on."

方法三
            #!/bin/bash
            #
            while true; do
                who | grep "centos" &> /dev/null
                if [ $? -eq 0 ];then
                break
                fi
                sleep 5
            done

echo "centos is logged."

while的特殊用法:遍历指定文件的每一行
    while read line; do
        循环体
    done <文件路径

练习:找出其UID为偶数的所有用户的用户名;并显示其ID号;

#!/bin/bash
        #
        file=/etc/passwd

while read line; do
            userid=`echo $line | cut -d: -f3`
            if [ $[$userid%2] -eq 0 ]; then
                echo $line | cut -d: -f1,3
            fi
        done < $file   
           
    练习:输出给定的文件的偶数行的行号,以及其行内信息统统改为大写字母输出;

declare -i i=1
        while read line; do
            if [ $[$i%2] -eq 0 ]; then
                echo -n "$i "
                echo $line | tr 'a-z' 'A-Z'
            fi
            let i++
        done < /path/from/somefile

练习:显示如下菜单给用户
        cpu) cpuifno
        mem) memory infomation
        disk) disk infomation
        quit) quit

(1) 用户给定的选项后,显示相应的信息;而后提示用户再次选择;
        (2) 非正确选择也提示用户重新选择,并说明,如果想退出请输入"quit";

#!/bin/bash
        #
        while true; do
        cat << EOF
        cpu) cpu
        mem) memory
        disk) disk
        quit) quit
        EOF

read -p "Your choice: " choice
            case $choice in
            cpu)
                lscpu ;;
            mem)
                free ;;
            disk)
                fdisk -l /dev/sd[a-z] ;;
            quit)
                break ;;
            esac
        done

bash循环for/while/until的更多相关文章

  1. bash循环

    bash脚本-循环02   bash脚本编程:循环 执行流程: 1.顺序执行 2.选择执行:if 3.循环执行:for,while,until 1.循环执行的条件 进入条件: for:列表元素非空 w ...

  2. bash循环语句

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

  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. 判断字符串string是数字、json结构、xml结构

    import org.json.JSONException; import org.json.JSONObject; import org.dom4j.DocumentException; impor ...

  2. More than one fragment with the name [spring_web] was found. This is not legal ...

    今天在搭建springweb应用环境的时候启动tomcat报错More than one fragment with the name [spring_web] was found. This is ...

  3. placeholder的兼容处理方法

    placeholder是html5新增的一个属性,极大的减轻了表单提示功能的实现,但是对于IE6-IE9真的是只能靠自己写啦! 但是在自己写时会掉进了一个坑里,还好用了一会时间还是爬出来啦. 最终的解 ...

  4. echarts使用中的那些事儿( 三)

    饼图上的那些字与下面说明性的文字有些重合,该怎么缩小圆形的大小呢,还有它的位置,怎么让它向上一些或者向下一些: 有以下两个属性可以解决问题: radius : '55%', ------------这 ...

  5. JavaBean+jsp开发模式 --结合form表单 实例

    1.创建form表单 <%@ page language="java" contentType="text/html; charset=UTF-8" pa ...

  6. [Oracle 视图] ALL_OBJECTS

    ALL_OBJECTS ALL_OBJECTS describes all objects accessible to the current user. ALL_OBJECTS描述当前用户的可访问的 ...

  7. Maven 中maven-assembly-plugin插件的使用笔记 SpringBoot环境

    首先创建一个多模块的SpringBoot项目 项目结构 父pom的内容如下: <?xml version="1.0" encoding="UTF-8"?& ...

  8. Python +selenium之集成测试报告与unittest单元测试

    随着软件不断迭代,对应的功能也会越来越多,从而对应的测试用例也会呈指数增长.如果将全部的测试用例集成在一个文件中就会显得特别的臃肿而且维护成本也会很高. 一个很好的放大就是将这些测试yo你给里按照功能 ...

  9. xampp默认配置拿shell

    xampp默认配置拿shell 首先我们先来科普一下xampp(Apache+MySQL+PHP+PERL)是一个功能强大的建 XAMPP 软件站集成软件包 是一个易于安装且包含 MySQL.PHP ...

  10. ES6中const的用法

    const声明一个只读的常量.一旦声明,常量的值就不能改变.且const一旦声明变量,就必须立即初始化,不能留到以后赋值. const的作用域与let命令相同:只在声明所在的块级作用域内有效. con ...