bash-shell高級編程--退出和退出狀態碼

退出和退出狀態碼

大家都知道exit是用來退出一個腳本,既可以使用exit來結束一個腳本,像常用的C語言一樣,它也會返回一個值,這個值會傳遞給腳本的父進程,父進程會使用這個值做下一步的處理。

其實在linux中執行任何一個命令都會返回一個退出碼,成功的命令返回0,而不成功的命令返回非零值,非零值通常通常都會解釋成一個錯誤碼。

當然腳本中的函數和腳本本身也會返回退出狀態碼,在腳本中最後執行的命令決定腳本返回的狀態碼(就是exit之前的命令)

#!/bin/bash

tldr ls

. . .

# 在執行exit之前的一個命令決定腳本返回值狀態碼值
ls -l name

exit
# exit $?

不帶參數的exit命令和exit $?的效果是一樣的,就算你在腳本的末尾不寫exit效果也是一樣的

bash腳本中$?保存這最後執行命令的退出狀態碼,當函數返回之後,$?同樣保存函數中最後執行的命令的退出狀態碼,這就是bash對函數返回值的處理方法,同樣,當一個腳本退出$?保存了腳本的退出狀態碼,這個退出狀態碼就是腳本中最後執行的命令的退出狀態碼。

#!/bin/bash
echo hello
echo $?
# 退出狀態爲0, 因爲命令執行成功.
lskdf
# 無效命令.
echo $?
# 非零的退出狀態, 因爲命令執行失敗.
echo
exit 113
# 返回113退出狀態給shell.
# 爲了驗證這個結果, 可以在腳本結束的地方使用"echo $?".
# 執行結果
andrew@andrew:/work/bash/src$ bash exit_example.sh 
hello
0
exit_example.sh: 行 5: lskdf: 未找到命令
127

andrew@andrew:/work/bash/src$ echo $?
113

使用$?測試腳本中命令執行的結果,往往顯得特別的有用

邏輯非操作,將會反轉命令或條件的測試結果,將會影響退出狀態碼

true # "true" 是內建命令.
echo "exit status of \"true\" = $?"
# 0

! true
echo "exit status of \"! true\" = $?"
# 1
# 注意: "!" 需要一個空格.
# !true將導致"command not found"錯誤

# 如果一個命令以'!'開頭, 那麼會啓用Bash的歷史機制.

true
!true
# 這次就沒有錯誤了, 也沒有反轉結果.
# 它只是重複了之前的命令(true).
發佈了366 篇原創文章 · 獲贊 144 · 訪問量 32萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章