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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM