1. 程式人生 > >2018-3-26Linux系統管理(14)bash腳本編程之循環控制語句

2018-3-26Linux系統管理(14)bash腳本編程之循環控制語句

Linux 系統管理

我們在上個章節中講到了如何使用yum來實現所謂的程序包管理,對於yum而言,它只是rpm包的一個前段管理工具,並不是取代rpm後端管理工具,它只是提供了較好的、基於倉庫的、完成元數據自動分析以及依賴關系自動分析及自動解決的這麽一個工具,但是強依賴於yum倉庫的存在,但是yum的工作架構為C/S架構,首先,對於需要安裝某個程序軟件來講,我們就稱之為客戶端(yum client),而我們管理程序包所使用的命令為yum命令。而服務器端並不是yum服務器端,但我們可以稱之為yum的倉庫端(yum repository),yum的倉庫端需要提供一種文件共享服務,將其yum倉庫的程序包讓客戶端能夠訪問到,這其中在C/S架構模型當中經常用到的協無非就是
ftp/http/https,那也就意味著,實際上yum工作時,每一個客戶端主機都需要有yum命令,其次還需要提供其配置文件,可提供多個以.repo結尾放置在/etc/yum.repos.d/目錄下,也是片段性文件。

每一個.repo結尾的文件就可以定義一個yum的指向,但也可以定義多個,那麽我們對於以上的總結及yum的語法格式做出簡單贅述:

   回顧:yum程序包管理器和編譯安裝
        C/S
          yum client(yum)
          yum repository(ftp/http/https)
       
        base
        extras
        updates
    
        repo:
           [id]
           name=
           baseurl=http://
                   http://

但需要註意的是,對於CentOS任何一個發行版來講,至少有一個源叫base源,我們在安裝操作系統時,不可能將所有的軟件包將其安裝,要想安裝額外的安裝包時,可以將光盤制作成為yum倉庫,而那個倉庫就是一個base倉庫,所以無論是阿裏雲還是清華鏡像等站點,通常在os目錄下就有base源,但除了base源還有extrasupdates。無論是那個發行版,將光盤作為一個最基本的倉庫來安裝程序包,剩余則都是補充而已。

yum的各種管理機制就是通過其各種子命令來完成的,我們來簡單闡述並加以總結:

   子命令:
        yum的各種管理機制是由各種子命令形成的
        list, clean, makecache, grouplist, info, whatprovides
        install, update, remove, groupinstall, groupupdate, groupremove, groupinfo

以上就是總結的yum程序包的管理,而後我們也講到過如何用源碼包進行安裝該程序,而編譯安裝其實也是一種非常重要的能力,其主要講的還是C/C++編譯上的安裝,使用的為大致標準三個步驟,第一個是configure這是系統編譯安裝檢查腳本,並且編譯安裝符合條件之後還能結合Makefile.in,生成makefile文件,而第二步就是使用make結合makefile編譯的配置文件來編譯執行makefile,而編譯完成之後,無論是二進制還是庫文件程序以及配置文件等,都依然準備完成,而後使用make install復制到在configure指定的安裝路徑中去,生成相應的文件目錄,將文件依次歸類存放運用。

   編譯安裝:
      C/C++:
          ./confiure --> makefile.in ==> makefile
              make + makefile ==> binary, library, configfile, manual
              make install

那麽在這一章當中,繼續講解bash腳本的內容。

一、bash腳本編程之if語句

此前我們也講過,一個過程式編程語言的執行流程大致分為三類:

   過程式編程語言的執行流程:
        順序執行
        選擇執行
        循環執行

回顧我們此前講到的選擇執行,選擇執行可以有兩種方式來實現,第一種&&以及||,這是最常用的兩種機制,第二種是if語句,其實還有第三種為case語句。

   選擇執行:
        (1) &&, ||
        (2) if語句
        (3) case語句

那麽if語句其實是有三種格式,我們講了其中的兩種,第一種為單分支的if語句,為真執行該語句,為假則不執行該語句,另一種為雙分支的if語句,那麽之所以叫選擇分支就因為它是布爾型的條件,以此結果就帶來要麽為真,要麽為假,為真時執行該分支,為假時執行另一個該分支,所以叫做選擇執行,那麽第三種就是多分支的if語句,這種是在當有n種可能時,我們都需要做一下測試,所以當我們的條件不止有真假時,而是有多個選擇時,可以滿足多個測試時可將其應用。否則,所有的條件都不滿足時,我們才能執行無法識別的語句等。那麽無論是單分支或雙分支以及多分支語句的格式為:

   if語句:三種格式
        單分支的if語句
           if CONDITION; then
               if-true-分支
           fi
        
        雙分支的if語句
           if CONDITON1; then
               if-true-分支
           else
               if-false-分支
           fi
    
        多分支的if語句
           if CONDITION1; then
               條件1為真分支
           elif CONDITION2; then
               條件2為真分支
           elif CONDITION3; then
               條件3為真分支
           ... ...
           elif CONDITIONn; then
               條件n為真分支
           else
               所有條件均不滿足時分支
           fi

需要註意的是,多個CONDITION條件如果不互斥的話,多個條件滿足也是存在的,但在這裏的分支只能是執行其中一個,會執行首先測試為"真"的一個。如果該條件為真時,則後續條件不用測試,如果條件都不為真時,則執行else分支。

   註意:即便多個條件可能同時都能滿足,分支只會執行其中一個,首先測試為"真";

練習:讓用戶通過腳本參數傳遞一個文件路徑給腳本進行判斷其類型。

#!/bin/bash
#

[ -z "$1" ] && echo "Please input filename or directory address" && exit 2
[ $# -lt 1 ] && echo "At lease on path" 
[ ! -e "$1" ] && echo "No Such File!" && exit 3

if [ -d "$1" ]; then
	echo "This is Directory!"

elif [ -f "$1" ]; then
	echo "This is a Commin Files!"

elif [ -L "$1" ]; then
	echo "This is a Link Files."

elif [ -b "$1" ]; then
	echo "This is Block Files!"

elif [ -c "$1" ]; then
	echo "This is Charactor Files!"

elif [ -S "$1" ]; then
	echo "This is a Socket Files."

else
	echo "Unknown Files or Directory!"

fi

測試或者選擇語句還有第三種語句,叫做case語句,其實case語句就是簡化版的多分支語句,用於實現簡化版的多分支if,但未必每個多分支的if語句都能寫成case語句,還有就是if語句其實是可以嵌套的,也就是說,if中可以繼續使用if,還可以包含其它執行語句。

   註意:if語句可嵌套

二、bash腳本之循環語句

所謂循環執行我們此前講過,無非就是將一段代碼重復執行n次,能夠實行將一段代碼重復實行n次,需要註意的是,要實行循環時,就要指定其循環次數,我們要想辦法控制其循環次數,不然的話則無法退出,變成死循環,當然也有些場合是需要實行死循環。

對於循環來說有兩個關鍵要點,一種就是進入條件,就是什麽時候開始循環,另一種就是退出條件,而這兩點非常重要。所謂進入條件指的是,當程序執行到循環體時,判斷是否能夠執行以及是否能夠執行,要取決於記錄條件。

   循環執行:將一段代碼重復執行0次、1次或多次;
       進入條件:條件滿足時則進入循環;
       退出條件:每個條件都應該有退出條件,以有機會退出循環;

對於bash腳本來講,共有三種循環方式,分別為:

   bash腳本:
       for循環
       while循環
       until循環

後兩者沒有太大的區別,除了進入條件相反。

2.1 for循環

對於for循環來說,將列表中的每個元素依次賦值給VARIABLE中進行遍歷執行循環體即可,for循環共有兩種格式。

   for循環:
        兩種格式:
            (1) 遍歷列表
            (2) 控制變量

我們先說第一種,通過遍歷列表的格式,則for循環遍歷語法格式為:

   遍歷列表:
       for VARIABLE in LIST; do
           循環體
       done

那麽for循環的進入條件和退出條件為:

   進入條件:只要列表有元素,即可進入循環;
   退出循環:列表中的元素遍歷完成;

例如:創建是個文件,從f1-f10。

#!/bin/bash
#

for i in 1 2 3 4 5 6 7 8 9 10; do
    touch /tmp/f$1
done

當然如果要是這樣創建100個文件的話,確實是一件非常麻煩的事情,另外一個,不能直接使用touch命令,很有可能是會更改時間戳的,真正創建文件時,應該判斷是否存在,如果不存在則創建,存在的話則更改一下時間戳而已。所以說一定要註意該命令實現什麽功能,是否有其冪等性,每個循環當中的冪等是能夠重復執行的,冪等執行可允不允許重復執行,即使不重復執行時,哪怕只執行一次,也得有個意外條件,所以說判斷至關重要。

那麽LIST的生成方式有很多中,剛才給出的示例也是其中一種,那麽我們現在對於LIST的生成方式做一下簡單的闡述:

   LIST生成方式:
       (1) 直接給出;
       (2) 整數列表
           (a) {start..end}
           (b) seq [start [incremtal]] last
    
       (3) 返回列表的指令;
       (4) glob;
       (5) 變量引用
           $@, $#
    
       ... ...


2018-3-26Linux系統管理(14)bash腳本編程之循環控制語句