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.www58058.com/36985

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

相關推薦

  • 03硬鏈接和軟鏈接的區別和聯系

    首先我們需要了解linux下硬鏈接以及軟連接的基本概念. 硬鏈接:新建的文件是已經存在的文件的一個別名,當原文件刪除時,新建的文件仍然可以使用. 軟鏈接:也稱為符號鏈接,新建的文件以“路徑”的形式來表示另一個文件,和Windows的快捷方式十分相似,新建的軟鏈接可以指向不存在的文件. 硬鏈接和軟連接之間的區別: 1.硬鏈接和原來的文件沒有什么區別,而且共享一…

    Linux干貨 2016-10-20
  • CentOS進程管理

    CentOS進程管理 筆記 Linux系統中的基本運行單位是進程,通過對系統系統中的進程的管理能夠對系統的實時運行狀態進行了解和調度。Linux中提供了用于查看、調整和停止進程的命令。本文仍然以RHEL6說明Linux系統的進程管理。 CentOS進程管理 一、進程概述 二、查看進程 1、使用ps命令 2、top命令 一、進程概述 程序是保存在存儲介質中的可…

    Linux干貨 2017-05-15
  • 2

    2

    Linux干貨 2018-03-26
  • centos7編譯安裝zabbix

    centos7源碼編譯安裝zabbix3 centos7源碼編譯安裝zabbix3 centos7源碼編譯安裝zabbix3 系統配置和必要的安裝包 編譯安裝nginx 編譯安裝php 安裝MariaDB 安裝JDK 安裝Zabbix3.0 前戲準備 開始編譯 開始安裝 zabbix虛擬主機創建 前戲準備 開始編譯 開始安裝 php配置 前戲準備 開始編譯 …

    Linux干貨 2016-11-25
  • Linux網絡屬性配置

      如何將linux主機接入到TCP/IP網絡中:     第一步:         配置IP/NETMASK(ip地址、子網掩碼):本地通信     第二步:   &n…

    Linux干貨 2016-12-16
  • Linux 的硬鏈接與軟鏈接的區別

       鏈接是指在電子計算機程序的各模塊之間傳遞參數和控制命令,并把它們組成一個可執行的整體的過程。通俗一點無非是把文件名和計算機文件系統使用的節點號鏈接起來。   linux中鏈接有硬鏈接和軟連接之分,首先我們來介紹硬鏈接,硬鏈接相當于創建了文件的第二個名字,增加了額外的記錄項用來引用文件,還是隸屬與同一文件系統上,是同一個物理…

    Linux干貨 2016-10-20
欧美性久久久久