bash脚本编程之流程控制if、for、while、until简介

概述

    之前介绍了一些bash脚本编程的变量、运算、条件测试的一些基础内容,了解了脚本实际上就是一些语句加上一些流程控制组合起来,实现某种功能的可执行文件。我们知道,条件测试的目的,实际就是为了实现一种流程的控制,那么本篇就简单介绍一下bash里面常见的流程控制语句,包括选择、循环等内容,具体包括以下几个部分:

    1、选择控制之if语句

    2、选择控制之case语句

    3、循环控制之for语句

    4、循环控制之while语句

    5、循环控制之until语句

    6、break和continue的介绍

    7、流程控制语句示例脚本

第一章    选择控制之if语句

    1、单分支if语句格式

        if 判断条件: then

            条件为真的分支代码

        fi

    2、双分支if语句格式

        if 判断条件; then

            条件为真的分支代码

        else

            条件为假的分支代码

        fi

    3、多分支if语句格式

        if 判断条件1; then

            条件1为真的分支代码

        elif 判断条件2; then

            条件2为真的分支代码

        elif 判断条件3; then

            条件3为真的分支代码

        …

        else

            所有条件都不满足执行的语句

        fi

        逐条件进行判断,第一次遇为“真”条件时,执行其分支,而后结束整个if语句

第二章    选择控制之case语句

    当用if来进行判断时,如果条件中的值不是某一些连续的取值范围,这时,如果依然用if来进行条件的过滤,代码量将会大大增加。这时针对这些离散,没有规律的取值对象进行选择执行时,就需要用到case语句了。

    case语句的语法格式为:

        case 变量引用 in

        PAT1)

            分支1

        ;;

        PAT2)

            分支2

        ;;

        …

        *)

            默认分支

        ;;

        esac

    其中PAT为变量的取值,支持glob风格的通配符:

        *: 任意长度任意字符

        ?: 任意单个字符

        []:指定范围内的任意单个字符

        a|b: a或b

第三章    循环控制之for语句

    1、for的语法格式一      

        for 变量名 in 列表;do

            循环体

        done

        此种模式下for的执行机制:

            依次将列表中的元素赋值给“变量名”,每次赋值后即执行一次循环体,直到列表中的元素耗尽,循环结束

        for中列表的生成方式:

         <1> 直接给出列表

         <2> 整数列表:

              {start..end}

              `seq [start [step]] end`

         <3> 返回列表的命令 $(COMMAND)

         <4> 使用glob, 如: *.sh

         <5> 变量引用;$@, $

    2、for的语法格式二   

        for ((控制变量初始化;条件判断表达式;控制变量的修正表达式))

        do

            循环体

        done

        控制变量初始化:仅在运行到循环代码段时执行一次

        控制变量的修正表达式:每轮循环结束会先进行控制变量修正运算,而后再做条件判断

        例如:

            for ((i=1;i<=10;i++))

            do

                echo "nihao"

            done

第四章    循环控制之while语句

    1、while的常规格式

        while CONDITION; do

            循环体

        done

        CONDITION:循环控制条件;进入循环之前,先做一次判断;每一次循环之后会再次做判断;条件为 true,则执行一次循环;直到条件测试状态为false终止循环。因此:CONDITION一般应该有循环控制变量;而此变量的值会在循环体不断地被修正

        进入条件: CONDITION为true

        退出条件: CONDITION为false

    2、无限循环:

        while true; do

            循环体

        done

    3、while循环的特殊用法(遍历文件的每一行):

        while read line; do

            循环体

        done < /PATH/FROM/SOMEFILE

        依次读取/PATH/FROM/SOMEFILE文件中的每一行,且将行赋值给变量line

第五章    循环控制之until语句

    1、常规until循环格式

        until CONDITION; do

            循环体

        done

        进入条件: CONDITION 为false

        退出条件: CONDITION 为true

    2、创建无限循环

        until false; do

            循环体

        done

第六章    break和continue介绍

    1、continue语句,用于循环体中

        continue [N]  提前结束第N层的本轮循环,而直接进入下一轮判断;最内层为第1层

        while CONDTIITON1; do

            CMD1

            …

            if CONDITION2; then

                continue

            fi

            CMDn

            …

        done

    2、break语句

        break [N]   提前结束第N层循环, 最内层为第1层

        while CONDTIITON1; do

            CMD1

            …

            if CONDITION2; then

                break

            fi

            CMDn

            …

        done

第七章    流程控制语句示例脚本

    1、写个脚本:实现打印正边三角形

    #!/bin/bash
    # Autor: nwc
    # Version: 2.0
    # CreateTime: 2016-08-17
    # Description:利用循环语句,实现打印三角形    
    #    *
    #   ***
    #  *****
    # *******
    #********* 
    
    read -p "please input the lines: " Line
    echo "================A PROJECT=============="
    if expr $Line + 0 &>/dev/null && [ `expr $Line + 0` -gt 0 ];then
            for((i=1;i<=$Line;i++)){
        
                    for((S=$Line;S>i;S--)){
                            echo -n " "
                    }   
    
                    for LS in `seq 1 $i`;do
                            echo -ne "\033[31m*\033[0m"
                    done
    
                    for((RS=1;RS<i;RS++)){
                            echo -ne "\033[31m*\033[0m"
                    }
            echo
            }
    else
            echo "wrong args"
    fi
    
    echo "================B PROJECT=============="
    
    if expr $Line + 0 &>/dev/null && [ `expr $Line + 0` -gt 0 ];then
            for((j=1;j<=$Line;j++)){
                    sp=$[${Line}-$j]
                    st=$[$j*2-1]
                    for((k=1;k<=$sp;k++)){
                            echo -n " "
                    }
                    for((m=1;m<=$st;m++)){
                            echo -ne "\033[31m*\033[0m"
                    }
                    echo
            }
    else
            echo "wrong args"
    fi
    
    unset Line
    unset i
    unset S
    unset LS
    unset RS
    unset j
    unset sp
    unset st
    unset k
    unset m

   执行结果如下:

    blob.png

    2、用until循环实现国际象棋棋盘

    #!/bin/bash    
    # Autor: nwc
    # Version: 2.0
    # CreateTime: 2016-08-18
    # Description:用unilt打印国际象棋棋盘
    
    read -p "please input the lines: " line
    read -p "please input the rows: " row 
    
    if [ $line -ge 1 ] &>/dev/null && [ $row -ge 1 ] &>/dev/null ;then
    l=1
    r=1
    #l和r分别代表初始行坐标和初始列坐标
    w="\033[47m  \033[0m"
    b="\033[40m  \033[0m"
    until [ $l -gt $line ];do
            until [ $r -gt $row ];do
                    m=$[($l+$r)%2]
                    [ $m -eq 0 ] && echo -ne "$w" || echo -ne "$b"
                    let r++ 
            done
            echo
            let l++ 
            r=1 
    done
    else
            echo "bad lines or rows"
    fi
    
    unset line
    unset row
    unset l
    unset r
    unset w
    unset b

    执行效果为:

    blob.png

原创文章,作者:M20-1倪文超,如若转载,请注明出处:http://www.178linux.com/36985

(0)
M20-1倪文超M20-1倪文超
上一篇 2016-08-18
下一篇 2016-08-18

相关推荐

  • 基于lvs调度的web应用——Discuz程序

    实验环境: 前端主机:10.1.43.101 后端主机1:172.16.0.9   作为lvs-dr的调度器,并且提供mysql和nfs文件共享 后端主机2:172.16.0.2   作为ap服务器之一 后端主机3:172.16.0.3   作为ap服务器之一 实验拓扑: 后端主机1: [root@node3…

    Linux干货 2016-10-26
  • 文本处理三剑客之sed及vi编辑使用

    作用:       sed是Linux系统文本处理工具中的三剑客之一,它是一种流编辑器,以行为单位,能够使用正则表达式;跟其他文本处理工具模式相同,不对原文件直接操作,而是先借用一个临 时的数据缓冲区存放文文本数据,同时还有一个自己独特的空间"pattern space",我们称之为sed的模式空间,它的处理…

    Linux干货 2016-08-11
  • ​从实验来了解grub

    实验一为grub设置密码 先看一看grub是怎么样的 grub有两个版本 grub: GRand Unified Bootloader grub 0.x: grub legacy grub 1.x: grub2  Note:grub 1.x是完全重写的只不过是保留grub 0.x的工作机制。 2.利用grub自带命令生成密码grub-md5-cry…

    Linux干货 2016-06-09
  • 基础命令。

    简单基础小命令 查看目录 ls 查看当前路径下的目录 ls -a 查看当前路径下的所有目录,包含隐藏目录(带.的就是隐藏) ls -A 跟-a一样,只是不显示上一路径和本身路径(就是.和..) ls -l 显示额外的信息 ls -R 进入每个文件夹查看(递归) ls -ld 查看元数据 ls -1(数字) 排列 ls -r 倒序 ls -t 按修改时间排序 …

    Linux干货 2017-05-29
  • 显示列表和复制文件的各种实例

    显示/var目录下所有以l开头,以一个小写字母结尾,且中间至少出现一位数字(可以有其它字符)的文件或目录。 [root@localhost tmp]# ls -d /var/l*[[:lower:]] 显示/etc目录下,以任意一个数字开头,且以非数字结尾的文件或目录。 [root@localhost tmp]# ls -d /etc/[0-9]*[^0-9…

    Linux干货 2018-03-01
  • n28-第四周

    1、复制/etc/skel目录为/home/tuser1,要求/home/tuser1及其内部文件的属组和其它用户均没有任何访问权限 答:install 复制文件并设置属性 -d, –directory:复制所有参数为目录名 -m, –mode=MODE:设置文件属性,相当于chmod # install -d -m u=rwx /e…

    Linux干货 2017-12-24