第六章:退出和退出狀態
阿新 • • 發佈:2022-06-06
exit命令一般用於結束一個指令碼,就像C語言的exit一樣。它也能返回一個值給父程序。
每一個命令都能返回一個退出狀態(有時也看做返回狀態).一個命令執行成功返回0,一個執行不成功的命令則返回一個非零值,此值通常可以被解釋成一個對應的錯誤值。除了一些例外的情況,一個行為端莊的UNIX命令,程式或是軟體包執行成功能返回0的作為退出碼。
同樣的,在腳本里的函式和指令碼自身都會返回一個退出狀態碼。在指令碼或函式裡被執行的最後一個命令將決定退出狀態碼。在一個腳本里,exit nnn 命令將會返回shell一個nnn的退出狀態碼。(nnn必須是一個在0-255範圍的十進位制整數)。
如果一個指令碼以不帶引數的exit
1 #!/bin/bash
2
3 COMMAND_1
4
5 . . .
6
7 # 指令碼將會以最後命令COMMAND_LAST的狀態碼退出。
8 COMMAND_LAST
9
10 exit
指令碼結束沒有exit,不帶引數的exit和exit $?三者是等價的。
1 #!/bin/bash 2 3 COMMAND_1 4 5 . . . 6 7 # 會以最後命令的退出碼退出指令碼. 8 COMMAND_LAST 9 10 exit $?
1 #!/bin/bash
2
3 COMMAND1
4
5 . . .
6
7 # 會以最後命令的退出碼退出指令碼.
8 COMMAND_LAST
$?變數儲存了最後一個命令執行後的退出狀態。當一個函式返回時,$?儲存了函式裡最後一個命令的退出狀態碼。這就是Bash裡函式返回值的處理辦法。當一個指令碼執行結束,$? 變數儲存指令碼的退出狀態,而指令碼的退出狀態則是指令碼中最後一個已執行命令的退出狀態。並且依照慣例,0表示執行成功,1-255的整數範圍表示錯誤。
例子 6-1. 退出/退出狀態碼
1 #!/bin/bash 2 3 echo hello 4 echo $? # 因為上一條命令執行成功,列印0. 5 6 lskdf # 無效命令. 7 echo $? # 因為上面的無效命令執行失敗,列印一個非零的值. 8 9 echo 10 11 exit 113 # 返回113狀態碼給shell. 12 # 可以執行指令碼結束後立即執行命令"echo $?" 檢驗. 13 14 # 依照慣例,命令'exit 0'表示執行成功, 15 #+ 當產生一個非零退出值時表示一個錯誤或是反常的條件。
$? 變數用於測試指令碼中的命令執行結果非常的有用(參考例子 12-32和例子 12-17).
邏輯非操作符!反轉一個命令或一個測試的結果,它也能反轉退出狀態.
例子 6-2. 邏輯非一個條件結果的用法
1 true # ture命令是內建的.
2 echo "exit status of \"true\" = $?" # 0
3
4 ! true
5 echo "exit status of \"! true\" = $?" # 1
6 # 注意邏輯非字元"!"需要一個空格.
7 # !true 會導致一個"command not found"(命令沒有發現)的錯誤。
8 #
9 # 操作符'!'放在一個命令前面會導致呼叫Bash的歷史機制。
10
11 true
12 !true
13 # 這次沒有錯誤,也沒有反轉結果.
14 # 它只是重複執行上次的命令(true).
有一些退出狀態碼被用於保留(reserved meanings) 的含義,不應該在使用者指令碼使用。