Shell 基礎 2-判斷指令執行成功

通常使用 Shell script 會需要判斷一些指令的執行結果,並將執行結果列印至 log 記錄起來,或是做出相對應的處理。本文在此列出 2 種可以達成此目標的語法。

如果你對於 Shell script 基本語法不太清楚的話,強烈建議先看看這篇:Shell 基礎 1-宣告, 變數, 函數, 確認檔案存在

$?

變數 $? 是 Linux 指令執行結束時所送出的執行結果代碼,而這就是來自於程式的尾端都要 return 結果。基本上,$? 數值為 0 的話,就代表執行正常結束,反之就是其他狀態。然而,執行結果若為其他數值,就必須要去查代表的意義為何,或是我們可以針對特定執行結果各別進行特定的後續處理。

下列範例第3行是為了讓 tar 在進行壓縮的過程不會輸出與壓縮路徑問題相關的訊息,所以選擇不用完整路徑當參數,而是直接切換到想要進行壓縮的目錄之下執行 tar
第6行,可以發現這邊用雙引號將變數 $? 包起來,原因是這邊的判斷式 if 是以文字比對。而本範例的邏輯是如果等於 "0" 就顯示成功,其餘的輸出則會顯示 “Failure.” 的字樣。

記得包住 if 判斷條件的中括號內側,都要留一個空白字元。

Output

 

第6行也可以直接用指令結束的回傳值來做判斷,像下面這樣。

 

 

command && <success> || <failure>

這是另一種語法,僅能完成一些簡單的處理流程,但卻有讓程式看起來比較精簡一點的效果。這種語法是在指令後方以兩種符號界定成功或失敗要執行的動作,其中 && 後方連接著成功後要做的事,|| 則是失敗的話要執行的事。

下列範例的目的與上面一樣,只是換成這種語法。

Output

 

這種語法能判斷執行成功或失敗時要做的事情,當然也可以選擇判斷其中一種結果發生時的後續動作。下列這個做法就是當執行 tar 出錯時,才顯示錯誤的作法。

 

Reference
  1. How to conditionally do something if a command succeeded or failed

 

Andy Wang

站在巨人的肩膀上仍須戰戰兢兢!

發表迴響

這個網站採用 Akismet 服務減少垃圾留言。進一步瞭解 Akismet 如何處理網站訪客的留言資料