1. 程式人生 > 其它 >第六章:退出和退出狀態

第六章:退出和退出狀態

exit命令一般用於結束一個指令碼,就像C語言的exit一樣。它也能返回一個值給父程序。

每一個命令都能返回一個退出狀態(有時也看做返回狀態).一個命令執行成功返回0,一個執行不成功的命令則返回一個非零值,此值通常可以被解釋成一個對應的錯誤值。除了一些例外的情況,一個行為端莊的UNIX命令,程式或是軟體包執行成功能返回0的作為退出碼。

同樣的,在腳本里的函式和指令碼自身都會返回一個退出狀態碼。在指令碼或函式裡被執行的最後一個命令將決定退出狀態碼。在一個腳本里,exit nnn 命令將會返回shell一個nnn的退出狀態碼。(nnn必須是一個在0-255範圍的十進位制整數)。

如果一個指令碼以不帶引數的exit

命令結束,指令碼的退出狀態碼將會是執行exit命令前的最後一個命令的退出碼。

   1 #!/bin/bash
   2 
   3 COMMAND_1
   4 
   5 . . .
   6 
   7 # 指令碼將會以最後命令COMMAND_LAST的狀態碼退出。
   8 COMMAND_LAST
   9 
  10 exit

指令碼結束沒有exit,不帶引數的exitexit $?三者是等價的。

   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) 的含義,不應該在使用者指令碼使用。