Shell基礎(chǔ)腳本-退出與退出狀態(tài)

跟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)。
#============================================================  #
>

某些特定的退出碼具有一些特定的 保留含義,用戶不應該在自己的腳本中重新定義它們

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容