循环结构

循环结构

循环执行:
    讲一段代码重复执行一次或多次
    
    进入条件:条件满足时进入循环
    退出条件:每一个循环都应该有退出条件,以有机会退出循环;
    
    
    bash脚本有三种循环方式:        
        for循环:        
        while循环:
        until循环:        
    for循环:
        两种格式:
            (1)遍历列表的格式
            (2)通过控制变量来控制循环次数的方式
            
        遍历列表:            
        for VARAIBLE in LIST;do
                循环体            
        done
            
            
            进入条件:只要列表有可用元素,即可进入循环。
            退出条件:列表中的元素遍历完成
            
        LIST的生成方式:
            (1):直接给出
            (2):整数列表
                (a){start..end}
                (b)seq [start] [incremtal] last
            (3)返回列表的命令
            (4)glob
            (5)变量引用                
                $@  $#
        #!/bin/bash
        #
        for username in user24 user25 user26; do
                if id $username &> /dev/null;then
                        echo "$username exists"
                else
                        useradd $username && echo "Add user $username finished."
                fi
        
        done

    
    
        [root@localhost ~]# bash -x /root/for/for1.sh
        + for username in user24 user25 user26
        + id user24
        + useradd user24
        + echo 'Add user user24 finished.'
        Add user user24 finished.
        + for username in user24 user25 user26
        + id user25
        + useradd user25
        + echo 'Add user user25 finished.'
        Add user user25 finished.
        + for username in user24 user25 user26
        + id user26
        + useradd user26
        + echo 'Add user user26 finished.'
        Add user user26 finished.

        上面是简单的使用for循环的方式
        
        
    实例:求100以内所有正整数之和;        #!/bin/bash
        #
        declare -i sum=0
        for i in {1..100};do
                sum=$[$sum+$i]        
        done
        echo $sum

    [root@localhost ~]# bash /root/for/sum.sh
    5050
    
    
    
    while循环:        
        while CONDITION; do
                循环体        
        done
    
    CONDITION :循环控制条件;进入循环之前,先做一次判断;每一次循环之后会再次做判断;条件为“true” ,则执行一次循环;直到条件测试状态为“false” 终止循环
    
    因此:CONDTION 一般应该有循环控制变量;而此变量的值会在循环体不断地被修正
    
    进入条件:CONDITION 为true;
    退出条件:CONDITION 为false
    
    until循环:
        until CONDITION; do
            循环体        
        done
    进入条件: CONDITION  为false 
    退出条件: CONDITION  为true
    
        循环控制语句:continue
    用于循环体中    
    continue [N] :提前结束第N层的本轮循环,而直接进入下一轮判断;最内层为第1层        
        while CONDTIITON1; do
            CMD1
            ...            
            if CONDITION2; then
                continue
            fi
            CMDn
            ...        
       done
        
    实例:        
        #!/bin/bash
        #
        #
        #
        i=0
        while [ $i -lt 9 ];do
                let i++
                [ $i -eq 5 ] && continue
                echo "$i"
        done
        
        [root@localhost ~]# bash /root/tiaochu/continue.sh
        1
        2
        3
        4
        6
        7
        8
        9
        [root@localhost ~]# 
        
    前期运行错误分析:
        代码如下:            
            #!/bin/bash
            #
            #
            #
            i=0
            while [ $i -lt 9 ];do
                    [ $i -eq 5 ] && continue
                    echo "$i"
                    let i++            
            done
        
        运行结果如下:
            [root@localhost ~]# bash /root/tiaochu/continue.sh
            0
            1
            2
            3
            4
        脚本没有跳出本次循环执行下次循环,也没有退出程序。
        分析后得出结果:在循环中,代码let i++写在了continue跳出语句的后面,导致变量i的值一直处于符合跳出条件i=5,所以每次执行的都是跳出本次循环的操作。无法执行下面的let i++。修改后如此前写的那样,程序正常运行。在后面的操作中要注意此类问题。!!!!!!



循环控制语句:break  
    用于循环体中    
     break [N] :提前结束第N层循环,最内层为第1层       
      while CONDTIITON1; do 
            CMD1
            ...            
            if CONDITION2; then
                break
            fi
            CMDn
            ...        
     done
        
    实例:        
        #!/bin/bash
        #
        #
        #
        i=0
        while [ $i -lt 9 ];do
                [ $i -eq 5 ] && break
                echo "$i"
                let i++        
        done
    
    [root@localhost ~]# bash /root/tiaochu/continue.sh
    0
    1
    2
    3
    4
    [root@localhost ~]# 
    
    对于在使用continue中遇到的问题,在break语句中不会出现同样的情况,应为continue语句是跳出当前正在执行的本轮循环,而break语句是跳出整个循环程序。


创建无限循环    
    while true; do
        循环体    
    done

     until false; do
        循环体    
     done
     
     
     
   1 、判断/var/ 目录下所有文件的类型	
filetype.sh
#!/bin/bash
#
for filename in /var/* ;do
if [[ -S $filename ]];then
echo "Socket file"
elif [[ -L $filename ]];then
echo "Symbolic file"
elif [[ -d $filename ]];then
echo "Directory file"
elif [[ -b $filename ]];then
echo " Block special file"
elif [[ -c $filename ]];then
echo "character special file"
elif [[ -p $filename ]];then
echo "Named pipe file"
elif [[ -f $filename ]];then
echo "Common file"
else
echo "Other file"
fi
done
2、 、 添加10个  用户user1-user10 ,密码 同 用户名	
useradd.sh
#!/bin/bash
#
for username in {20..30};do
if id user$username &> /dev/null;then
echo "user$username"|passwd --stdin user$username &> /dev/null
else
useradd user$username
echo "user$username"|passwd --stdin user$username &> /dev/null
echo "add user user$username finished."
fi
done
3 、/etc/rc.d/rc3.d 目录下分别有多个以K 开头和以S 开头的
文件 ;分别 读取每个文件,以K 开头的文件输出为文件加stop
,以S 开头的文件输出为文件名加start; ;
“ “K34filename stop”
“S66filename start”
fileadd.sh
#!/bin/bash
#
for filename in /etc/rc.d/rc3.d/*;do
if [[ $filename =~ /.*/+[kK].*$ ]];then
echo "$filename" |sed -r 's@/.*/+([kK].*)$@\1@' &> /dev/null
echo "${filename}stop"
elif [[ $filename =~ /.*/+[sS].*$ ]];then
echo "$filename" |sed -r 's@/.*/+([Ss].*)$@\1@' &> /dev/null
echo "${filename}start"
else
echo "Other"
fi
done
4 、编写脚本 ,提示输入正整数n 的值,计算1+2+3+…n 的总
和
numsum.sh
#!/bin/bash
#
read -p "enter a integer::" num
sum=0
if [ -n $num -a $num -gt 0 ];then
expr $num + 0 &> /dev/null
if [ `echo $?` -eq 0 ];then
for i in `seq 1 $num`;do
sum=$[$sum+$i]
done
echo "$sum"
else
echo "enter a integer"
fi
else
echo "enter a integer"
fi
5、 、 打印九九乘法表
chengfabiao.sh
#!/bin/bash
#
#!/bin/bash
#
#
read -p "请输入要打印的行数::" n
echo "=========================================="
for i in `seq $n`
do
        kd=$[$n-$i]
        for k in `seq $kd`
        do
                echo -n " "
        done
        qd=$[2*$i-1]
        for q in `seq $qd`
        do
                echo -n "*"
        done
        echo
done

echo "=========================================="
for  ((i=1;i<=n;i++))
do
        for  ((k=1;k<=n-i;k++))
        do
                echo -n " "
        done
        for  ((j=1;j<=2*i-1;j++))
        do
                echo -n "*"
        done
        echo
done
echo "=========================================="
i=1
while [ $i -le $n ]
do
        j=1
        k=$[$n-$i]
        while [ $j -le $k ]
        do
                echo -n " "
                ((j++))
        done
        q=1
        qd=$[2*$i-1]
        while [ $q -le $qd ]
        do
                echo -n "*"
                ((q++))
        done
        echo
        ((i++))
done
echo "=========================================="
i=1
until [ $i -gt $n ]
do      j=1
        k=$[$n-$i]
        until [ $j -gt $k ]
        do
                echo -n " "
                ((j++))
        done
        q=1
        qd=$[2*$i-1]
        until [ $q -gt $qd ]
        do
                echo -n "*"
                ((q++))
        done
        echo
        ((i++))
done
echo "=========================================="

原创文章,作者:dxkboke,如若转载,请注明出处:http://www.178linux.com/38586

(0)
dxkbokedxkboke
上一篇 2016-08-21
下一篇 2016-08-21

相关推荐

  • 权限管理

    权限 权限就是用户或者组对文件或者目录所拥有的能力,所能执行的操作。 权限的分配: 通过ls -l file这个命令可以查看文件或者目录的详细信息:     [root@localhost home]# ls -l /root/   &nb…

    Linux干货 2016-08-05
  • 8月3日作业

    文件权限相关的课堂练习: 1)当用户xiaoming对/testdir 目录无执行权限时,意味着无法做哪些操作?     用户小明不能进入/testdir,不能删除,不能创建。使用ll能看到有哪些文件,但是看不到具体信息 2)当用户xiaoqiang对/testdir 目录无读权限时,意味着无法做哪些操作? 不能查看文…

    Linux干货 2016-08-07
  • 萧田国给你五个2017GOPS北京站的参会理由!

    2017年7月28日,GOPS全球运维大会即将开幕,发起人萧田国将在主会场发表题为《运维如何延续自己的职业生涯》演讲,参加第七届北京站您会有哪些收益? 收益一: 【长达半天时间的培训式演讲】让您系统性掌握顶级互联网自动化运维体系 收益二: 【腾讯智能运维】传奇背后的细节,听了才知道 收益三: 与Facebook、Twitter、BATJ等运维大咖【面对面深度…

    Linux干货 2017-07-24
  • 2016全球运维大会,优云蒋君伟演讲“CMDB+自动化的管理融合”成一大亮点

    2016全球运维大会于9月23日-24日在上海盛大开幕。作为国内运维行业的重量级大会,优云产品总监蒋君伟在自动化专场与来自全国各地的运维同行一起探讨、分享业内自动化运维的最佳实践。现场情绪热烈,气氛高涨,成为了本届全球运维大会的一大亮点。 全新梳理自动化与CMDB的融合之道 全球运维大会当天,运维自动化专场很多大牛针对自动化运维管理中的CMDB进行了激烈的讨…

    Linux资讯 2016-12-05
  • 03葵花宝典之linux用户

    介绍了linux上有关用户和组的相关命令及配置文件

    2018-03-16
  • 实现CenOS7网卡名传统方式

    网卡命令:理念 CentOS 6之前,网络接口使用连续号码命名:eth0、eth1等,当 增加或删除网卡时,名称可能会发生变化 CentOS 7使用基于硬件,设备拓扑和设置类型命名: (1) 网卡命名机制 systemd对网络设备的命名方式 (a) 如果Firmware或BIOS为主板上集成的设备提供的索引信 息可用,且可预测则根据此索引进行命名, 例如en…

    Linux干货 2017-12-19

评论列表(1条)

  • 马哥教育
    马哥教育 2016-08-22 13:55

    脚本的学习没有捷径,再理清楚基本语法后剩下的是多写,多看优秀代码,这样才能写出优秀的脚本,建议有时间去找找一些生产环境中实用的脚本,学习写写,作业完成的很好,继续保持。