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

  咱們在上個章節中講到了如何使用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。不管是那個發行版,將光盤做爲一個最基本的倉庫來安裝程序包,剩餘則都是補充而已。bash

  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腳本的內容。編程語言

1、bash腳本編程之if語句

  此前咱們也講過,一個過程式編程語言的執行流程大體分爲三類:ide

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

  回顧咱們此前講到的選擇執行,選擇執行能夠有兩種方式來實現,第一種&&以及||,這是最經常使用的兩種機制,第二種是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語句可嵌套

2、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) 變量引用
           $@, $#
    
       ... ...
相關文章
相關標籤/搜索