Shell 基礎 2-判斷指令執行成功
通常使用 Shell script 會需要判斷一些指令的執行結果,並將執行結果列印至 log 記錄起來,或是做出相對應的處理。本文在此列出 2 種可以達成此目標的語法。
如果你對於 Shell script 基本語法不太清楚的話,強烈建議先看看這篇:Shell 基礎 1-宣告, 變數, 函數, 確認檔案存在
$?
變數 $?
是 Linux 指令執行結束時所送出的執行結果代碼,而這就是來自於程式的尾端都要 return
結果。基本上,$?
數值為 0
的話,就代表執行正常結束,反之就是其他狀態。然而,執行結果若為其他數值,就必須要去查代表的意義為何,或是我們可以針對特定執行結果各別進行特定的後續處理。
下列範例第3行是為了讓 tar
在進行壓縮的過程不會輸出與壓縮路徑問題相關的訊息,所以選擇不用完整路徑當參數,而是直接切換到想要進行壓縮的目錄之下執行 tar
。
第6行,可以發現這邊用雙引號將變數 $?
包起來,原因是這邊的判斷式 if
是以文字比對。而本範例的邏輯是如果等於 "0"
就顯示成功,其餘的輸出則會顯示 “Failure.” 的字樣。
記得包住
if
判斷條件的中括號內側,都要留一個空白字元。
1 2 3 4 5 6 7 8 9 10 11 |
#!/bin/bash cd /home/andy/Documents tar -zcf /home/andy/test.tar.gz ./* if [ "$?" -eq "0" ] then echo "Success." else echo "Failure." fi |
1 |
Success. |
第6行也可以直接用指令結束的回傳值來做判斷,像下面這樣。
1 |
if [ $? -eq 0 ] |
command && <success> || <failure>
這是另一種語法,僅能完成一些簡單的處理流程,但卻有讓程式看起來比較精簡一點的效果。這種語法是在指令後方以兩種符號界定成功或失敗要執行的動作,其中 &&
後方連接著成功後要做的事,||
則是失敗的話要執行的事。
下列範例的目的與上面一樣,只是換成這種語法。
1 2 3 |
#!/bin/bash tar -zcvf /Users/andy/Downloads/test.tar.gz ./* && echo "Success." || echo "Failure." |
1 |
Success. |
這種語法能判斷執行成功或失敗時要做的事情,當然也可以選擇判斷其中一種結果發生時的後續動作。下列這個做法就是當執行 tar
出錯時,才顯示錯誤的作法。
1 2 3 |
#!/bin/bash tar -zcvf /Users/andy/Downloads/test.tar.gz ./* || echo "Failure." |