典型退出狀態(tài)碼及其含義 |
|
退出狀態(tài)碼 |
含義 |
0 |
命令運行成功 |
1 |
通知未知錯誤 |
2 |
誤用shell命令 |
126 |
命令不可執(zhí)行 |
127 |
沒有找到命令 |
128 |
無效退出參數(shù) |
128+x |
linux信號x的嚴(yán)重錯誤 |
130 |
命令通過Ctrl+C終止 |
255 |
退出狀態(tài)碼越界 |
小實驗1
未指定函數(shù)返回值,且函數(shù)最后一條命令執(zhí)行成功
#!/bin/bash function hello(){ #echo "Hello World"; ech "Hello World"; return 3 # return 260 } hello echo $?
執(zhí)行結(jié)果
****@****:/******$ bash test.sh
Hello World
0
說明:由于此時未指定返回值,所以以函數(shù)最后一條被執(zhí)行的命令echo "Hello World";的執(zhí)行狀態(tài)作為函數(shù)的退出狀態(tài)。此時 echo "Hello World";執(zhí)行成功,所以返回0作為退出狀態(tài)碼。
小實驗2
未指定函數(shù)返回值,且函數(shù)最后一條命令執(zhí)行失敗(以無效指令為例)
#!/bin/bash function hello(){ #echo "Hello World"; ech "Hello World"; #return 3 # return 260 } hello echo $?
執(zhí)行結(jié)果
****@****:/******$ bash test.sh
test.sh: line 4: ech: command not found
127
說明:此時未指定返回值,所以函數(shù)以ech "Hello World";的執(zhí)行狀態(tài)作為hello函數(shù)的退出狀態(tài)。執(zhí)行失敗,且未約定特定的返回值用于標(biāo)識無效指令返回值,所以此時默認(rèn)以127作為退出狀態(tài)返回值。
小實驗3
指定函數(shù)返回值,且函數(shù)返回值在約定范圍內(nèi)
#!/bin/bash function hello(){ echo "Hello World"; #ech "Hello World"; return 3 # return 260 } hello echo $?
運行結(jié)果
****@****:/******$ bash test.sh
Hello World
3
說明:hello函數(shù)指定了返回值為3,由于3在約定的0~255范圍內(nèi),所以hello函數(shù)的退出狀態(tài)值碼從0變更為3(可對比小實驗1)。
小實驗4
指定函數(shù)返回值,且函數(shù)返回值在約定范圍外
#!/bin/bash function hello(){ echo "Hello World"; #ech "Hello World"; #return 3 return 260 } hello echo $?
返回結(jié)果
****@****:/******$ bash test.sh
Hello World
4
說明:hello函數(shù)指定了函數(shù)返回值為260,由于260超出了0~255,所以需要對指定的返回值進行一次取模運算,所以退出狀態(tài)碼由260變更為4。
小實驗5
指定函數(shù)返回值,但返回值前發(fā)生命令報錯
#!/bin/bash function hello(){ #echo "Hello World"; ech "Hello World"; return 3 #return 260 } hello echo $?
執(zhí)行結(jié)果
****@****:/******$ bash test.sh
test.sh: line 4: ech: command not found
3
說明:hello函數(shù)中一條命令執(zhí)行報錯并不會影響后續(xù)代碼的執(zhí)行,此時hello的函數(shù)返回值為指定的3。
小實驗6
在小實驗5的代碼運行以后再次輸入echo $?得到的還會是3么?
代碼與運行結(jié)果
****@****:/******$ cat test.sh #!/bin/bash function hello(){ #echo "Hello World"; ech "Hello World"; return 3 #return 260 } hello echo $? #exit 270 ****@****:/******$ bash test.sh test.sh: line 4: ech: command not found 3 ****@****:/******$ echo $? 0
說明:由于hello函數(shù)指定了退出狀態(tài)碼,所以第一次輸出的退出狀態(tài)碼為指定的整數(shù)3;第二次退出狀態(tài)碼則取腳本中最后一條命令echo $?命令的執(zhí)行狀態(tài),由于腳本中的echo $?成功執(zhí)行,所以第二次讀取的退出狀態(tài)碼為0。
思路:
1、 利用退出狀態(tài)碼,可以判斷命令是否成功執(zhí)行
2、 利用循環(huán)語句,可以實現(xiàn)命令的重試
3、 如果只設(shè)置退出狀態(tài)碼為0作為唯一的循環(huán)退出條件,可能出現(xiàn)死循環(huán),所以最好增加最大重試次數(shù)的控制邏輯
4、$?是一個即使變化的值,如果需要多次使用,最好賦值給一個變量
代碼
#! /bin/sh count=0 #記錄重試次數(shù) while [ 0 -eq 0 ] do echo ".................. job begin ..................." # date dat flag=$? echo "\$?"=${flag} if [ ${flag} -eq 0 ]; then echo "--------------- job complete ---------------" break; else count=$[ ${count}+1 ] if [ ${count} -eq 6 ];then echo "--------------- job failed ---------------" break; fi echo "...............error occur, retry in 60 seconds,count=${count} .........." # sleep 60 fi done
運行結(jié)果
****@****:/******$ bash test_while.sh
.................. job begin ...................
test_while.sh: line 7: dat: command not found
$?=127
...............error occur, retry in 60 seconds,count=1 ..........
.................. job begin ...................
test_while.sh: line 7: dat: command not found
$?=127
...............error occur, retry in 60 seconds,count=2 ..........
.................. job begin ...................
test_while.sh: line 7: dat: command not found
$?=127
...............error occur, retry in 60 seconds,count=3 ..........
.................. job begin ...................
test_while.sh: line 7: dat: command not found
$?=127
...............error occur, retry in 60 seconds,count=4 ..........
.................. job begin ...................
test_while.sh: line 7: dat: command not found
$?=127
...............error occur, retry in 60 seconds,count=5 ..........
.................. job begin ...................
test_while.sh: line 7: dat: command not found
$?=127
--------------- job failed ---------------
說明:當(dāng)退出狀態(tài)碼非0時,代碼中“[ 0 -eq 0 ]”和“[${flag}-eq 0 ]”部分實現(xiàn)了重試功能;“[${count}-eq 6 ]”部分實現(xiàn)了對重試邏輯不得超過6次的控制。
Shell退出狀態(tài)碼:
1、 假如沒有指定返回值,那么會用腳本的最后一個命令的執(zhí)行狀態(tài),作為退出的狀態(tài)碼,支持用exit命令指定退出碼。退出的狀態(tài)碼范圍是0~255,如果自定義的退出碼不在范圍內(nèi),會對其執(zhí)行取模運算;
2、 假如執(zhí)行的是一個有返回值的函數(shù)或者程序,那么執(zhí)行結(jié)束的返回值會被當(dāng)做當(dāng)前函數(shù)或程序的退出狀態(tài)值。
到此這篇關(guān)于Shell退出狀態(tài)碼及其應(yīng)用詳解的文章就介紹到這了,更多相關(guān)Shell退出狀態(tài)碼內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
標(biāo)簽:常州 河池 隴南 黔南 黔南 通遼 河北 淮南
巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Shell退出狀態(tài)碼及其應(yīng)用詳解》,本文關(guān)鍵詞 Shell,退出,狀態(tài),碼,及其,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。