1. 程式人生 > >Linux程式設計 23 shell程式設計(結構化條件判斷 命令if -then , if-then ... elif-then ...else,if test)

Linux程式設計 23 shell程式設計(結構化條件判斷 命令if -then , if-then ... elif-then ...else,if test)

一.概述

  在上一篇裡講到了shell指令碼,shell按照命令在指令碼中出現的順序依次進行處理,對於順序操作已經足夠了,但許多程式要求對shell指令碼中的命令加入一些邏輯流程控制,這樣的命令通常叫做 結構化命令。

  1.1 使用if - then語句

--最基本的結構化就是if -then語句,格式如下:
     if command
     then
        commands
     fi

  在其他程式語言中,if是一個等式,值結果為ture或false,但在bash shell的if語句並不是這樣。在bash shell的if語句會執行if後面的那個命令,如果該命令的退出狀態碼是0,位於then部分的命令就會被執行。反之則不執行,繼續執行指令碼中的下一個命令。 fi 語句用來表示if -then語句到此結束。下面是一個if -then簡單例子如下:    

  上面指令碼在if行採用了pwd命令,命令成功結束,echo語句顯示了文字字串。

  使用if 執行多個命令時,bash shell會將這些命令當成一個塊,如果if語句行的命令退出狀態值為0, 所有命令都會被執行,如果if語句行的命令的退出狀態不為0,所有的命令都會被跳過。下面一個案例if 涉及到了兩個命令一個是grep $testuser,  另一個是顯示路徑/etc/passwd。上圖示例中mysql使用者存在,報以退出狀態碼是0。並顯示了echo資訊。

      下面演示如果testuser變數設定成一個系統上不存在的使用者,狀態碼則不是返回0,不進入if then 中,什麼都不會顯示。    

  1.2  if-then-else語句

如果if 執行命令返回一個非零退出狀態碼,bash shell 會繼續執行指令碼中的下一條命令,這時else語句提供了作用,格式如下:

-- if -then -else格式:
if command
    then
        commands
    else
        commands
 fi

  下面示例,在原有指令碼上加入else語句塊,最後顯示了else中的資訊。

    

  1.3 巢狀if

  巢狀的if -then 語句位於主if -then-else語句的else程式碼塊中。如下所示在else 語句塊中再嵌入if-then-else

    

   對於else部分的另一種形式是: elif, 這樣就不用再寫多個if-then語句了,elif是另一個if-then語句延續else部分, 這種比上面的if巢狀可讀性強, 同樣把上面的指令碼改一下,示例如下,if 命令退出狀態碼不為0,進入到elif語句塊中。       對於elif後面還可以加else語句塊 ,當elif命令返回也不為0時,進入最後的else語句塊,如下圖所示:

      對於 elif語句 還可以是多個串起來。這裡就不再演示, 語法如下:

if command1
then
   command set 1
elif command2
then
    ...
elif command3
then
    ...
else
   ...
fi

  對於上面的if結構化語句,歸納起來如下面四種格式, 類似於其它編輯語言的if ..else 或if  ..else if.. else。

if-then 
if-then   else 
if-then   elif-then  else 
if-then   elif-then   elif-then     else

  1.4  結構化test命令

  上面的if 命令只能測試普通的shell命令的狀態碼,下面介紹test命令,它能測試不同條件, 條件成立同樣是退出狀態碼為0, 如果條件不成立測返回非0狀態碼。

-- test命令格式如下
if test  condition
then
    commands
fi

  下面是使用test命令確定變數中是否有內容,下面的testuser變數值為mysql,  因此test命令返回狀態碼為0,進入了then語句塊中。示例如下:      下面演示變數沒有值的情況下,test命令返回狀態碼不為0,進入了else語句塊中。      在bash shell中提供了另一種條件測試方法,無需在if -then語句中宣告test命令,使用[condition] 這種應該是日常使用比較頻繁的。 這種代替test的用法在下一篇中在詳細解說。

--格式如下:
if  [condition]
then 
    commands
fi