跟C程序類似,exit 命令被用來結(jié)束腳本。同時,它也會返回一個值,返回值可以被交給父進程
每個命令都會返回一個退出狀態(tài)(exit status),有時也叫做返回狀態(tài)(return status)或退出碼(exit code)。命令執(zhí)行成功返回0,如果返回一個非0值,通常情況下會被認為是一個錯誤代碼。一個運行狀態(tài)良好的UNIX命令、程序和工具在正常執(zhí)行退出后都會返回一個0的退出碼,當然也有例外
同樣地,腳本中的函數(shù)和腳本本身也會返回一個退出狀態(tài)。在腳本或者腳本函數(shù)中執(zhí)行的最后的命令會決定它們的退出狀態(tài)。在腳本中,exit nnn 命令將會把nnn退出狀態(tài)碼傳遞給shell(nnn 必須是 0-255 之間的整型數(shù))
當一個腳本以不帶參數(shù)的 exit 來結(jié)束時,腳本的退出狀態(tài)由腳本最后執(zhí)行命令決定(exit 命令之前)
#!/bin/bash
COMMAND_1
...
COMMAND_LAST
# 將以最后的命令來決定退出狀態(tài)
exit
exit,exit $? 以及省略 exit 效果等同
#!/bin/bash
COMMAND_1
...
COMMAND_LAST
#將以最后的命令來決定退出狀態(tài)
exit $?
#!/bin/bash
COMMAND_1
...
COMMAND_LAST
#將以最后的命令來決定退出狀態(tài)
$? 讀取上一個執(zhí)行命令的退出狀態(tài)。在一個函數(shù)返回后,$? 給出函數(shù)最后執(zhí)行的那條命令的退出狀態(tài)。這就是Bash函數(shù)的"返回值"。
在管道執(zhí)行后,$? 給出最后執(zhí)行的那條命令的退出狀態(tài)。
在腳本終止后,命令行下鍵入$?會給出腳本的退出狀態(tài),即在腳本中最后一條命令執(zhí)行后的退出狀態(tài)。一般情況下,0為成功,1-255為失敗。
樣例-1. 退出與退出狀態(tài)
#!/bin/bash
echo hello
echo $? # 返回值為0,因為執(zhí)行成功。
lskdf # 不認識的命令。
echo $? # 返回非0值,因為失敗了。
echo
exit 113 # 將返回113給shell
# 為了驗證這些,在腳本結(jié)束的地方使用“echo $?”
# 按照慣例,'exit 0' 意味著執(zhí)行成功,
#+ 非0意味著錯誤或者異常情況。
# 查看附錄章節(jié)“退出碼的特殊含義”
$? 對于測試腳本中的命令的執(zhí)行結(jié)果特別有用
邏輯非操作符 ! 將會反轉(zhuǎn)測試或命令的結(jié)果,并且這將會影響退出狀態(tài)
樣例-2. 否定一個條件使用!
true # true 是 shell 內(nèi)建命令。
echo "exit status of \"true\" = $?" # 0
! true
echo "exit status of \"! true\" = $?" # 1
# 注意在命令之間的 "!" 需要一個空格。
# !true 將導致一個"command not found"錯誤。
#
# 如果一個命令以'!'開頭,那么將調(diào)用 Bash 的歷史機制,顯示這個命令被使用的歷史。
true
!true
# 這次就沒有錯誤了,但是同樣也沒有反轉(zhuǎn)。
# 它不過是重復之前的命令(true)。
# ============================================================ #
# 在 _pipe_ 前使用 ! 將改變返回的退出狀態(tài)。
ls | bogus_command #bash: bogus_command: command not found
echo $? #127
>
! ls | bogus_command #bash: bogus_command:command not found
echo $? #0
# 注意 ! 不會改變管道的執(zhí)行。
# 只改變退出狀態(tài)。
#============================================================ #
>
某些特定的退出碼具有一些特定的 保留含義,用戶不應該在自己的腳本中重新定義它們