跳轉至內容

Bash Shell 指令碼/退出狀態

來自華夏公益教科書,開放的書籍,開放的世界

當一個程序完成時,它會返回一個小的非負整數,稱為它的退出狀態返回狀態給作業系統。按照慣例,如果它成功完成,則返回零,如果它失敗並出現錯誤,則返回一個正數。(這種方法允許使用不同的正數來區分多個不同的錯誤。)Bash 指令碼可以透過使用內建命令exit來遵守此慣例。以下命令

exit 4

終止 shell 指令碼,返回退出狀態為 4,表示某種錯誤。當沒有指定退出狀態時(無論是由於exit在沒有引數的情況下執行,還是由於指令碼在沒有呼叫exit的情況下結束),指令碼將返回它執行的最後一個命令的退出狀態。

退出狀態的一種使用方法是使用 Bash 運算子&&(“與”)和||(“或”)。如果兩個命令用&&分隔,則首先執行左側的命令,只有第一個命令成功時才會執行右側的命令。相反,如果它們用||分隔,則只有左側命令失敗時才會執行右側的命令。

例如,假設我們要刪除檔案file.txt並將其重新建立為一個空檔案。我們可以使用常見的 Unix 工具rm(“移除”)來刪除它,並使用常見的 Unix 工具touch來重新建立它;所以,我們可以這樣寫

rm file.txt
touch file.txt

但實際上,如果rm失敗,我們不想執行touch:如果我們最初未能刪除檔案,我們不想重新建立它。所以,我們可以改寫成這樣

rm file.txt && touch file.txt

這與之前相同,只是它不會嘗試執行touch,除非rm成功。

第三個類似布林運算子!(“非”)會反轉命令的退出狀態。例如,此命令

! rm file.txt

等效於rm file.txt,只是它在rm表示失敗時會表示成功,反之亦然。(當退出狀態用作實際退出狀態時,這通常沒有用,表示成功或失敗,但我們很快就會看到一些擴充套件的退出狀態用法,其中“非”操作更有用。)

命令的退出狀態(簡而言之)可以透過$?訪問。當需要區分多個不同的失敗狀態時,這會很有用;例如,grep命令(搜尋檔案中與指定模式匹配的行)在找到匹配項時返回 0,在沒有找到匹配項時返回 1,在發生真正的錯誤時返回 2。

華夏公益教科書