引言
通常,在編寫B(tài)ash腳本時(shí),需要在滿足特定條件時(shí)終止腳本,或者根據(jù)命令的退出代碼采取措施。
在本文中,我們將介紹Bash exit內(nèi)置命令和已執(zhí)行命令的退出狀態(tài)。
退出狀態(tài)
每個(gè)shell命令在成功終止時(shí)都會(huì)返回退出代碼。
按照慣例,退出代碼為零表示命令已成功完成,非退出代碼為零表示遇到錯(cuò)誤。
特殊變量$?返回最后執(zhí)行的命令的退出狀態(tài):
date &> /dev/null
echo $?
該 date 命令成功完成,并且退出代碼為 0。
如果嘗試ls在不存在的目錄上運(yùn)行,則退出代碼將為非零:
ls /nonexisting_dir &> /dev/null
echo $?
結(jié)果輸出 2。
狀態(tài)代碼可用于找出命令失敗的原因。每個(gè)命令的手冊(cè)頁,都包含有關(guān)退出代碼的信息。
當(dāng)執(zhí)行多命令管道時(shí),管道的退出狀態(tài)為最后一條命令的退出狀態(tài):
sudo tcpdump -n -l | tee file.out
echo $?
在上面的示例中,echo $?將打印 tee 命令的退出代碼。
Bash exit 指令
該exit命令以 N 狀態(tài)退出 shell 程序。它具有以下語法:
exit N
如果N未給出,則退出狀態(tài)代碼是最后執(zhí)行的命令的退出狀態(tài)代碼。
在shell腳本中使用時(shí),作為exit命令參數(shù)提供的值將作為退出代碼返回給shell。
舉例說明
命令的退出狀態(tài)可用于條件判斷語句。在以下示例中,如果在文件 filename 內(nèi)使用grep找到字符串“search-string”,則將以 0 退出(這在shell腳本中為true):
運(yùn)行以&&(AND)或||(OR)分隔的命令列表時(shí),命令的退出狀態(tài)確定是否將執(zhí)行列表中的下一個(gè)命令。此處,mkdir 僅在cd返回 0 時(shí)才執(zhí)行命令:
cd /opt/code && mkdir project
如果腳本結(jié)尾exit沒有指定參數(shù),則腳本退出代碼是腳本中最后執(zhí)行的命令的退出代碼。
#!/bin/bash
echo "doing stuff..."
exit
僅僅使用 exit,相當(dāng)于調(diào)用 exit $??;蛘吣阋部梢允÷?exit。
下面是顯示非腳本用戶調(diào)用腳本時(shí)如何終止腳本的示例:
如果您以root用戶身份運(yùn)行腳本,則退出代碼將為零。否則,腳本將以status退出1。
寫在最后
每個(gè) shell 命令終止時(shí),都會(huì)返回退出碼,在 bash 腳本中你可以靈活地使用,并控制程序流程。
HAppy coding :_)