一.概述
在上一篇里講到了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