Shell 中運行的命令會使用0-255之間的整數值,作為退出狀態碼,并以此來告知shell該命令執行的狀態。通常情況下,約定0代表命令成功結束,非0代表程序非正常退出。
典型退出狀態碼及其含義
退出狀態碼
python獲取返回狀態碼、含義
0
命令運行成功
1
python4。通知未知錯誤
2
誤用shell命令
126
Python Shell,命令不可執行
127
沒有找到命令
128
python線程狀態,無效退出參數
128+x
linux信號x的嚴重錯誤
130
以下shell腳本執行后輸出結果為,命令通過Ctrl+C終止
255
退出狀態碼越界
一、退出狀態碼的小實驗
python怎么用?小實驗1
未指定函數返回值,且函數最后一條命令執行成功
#!/bin/bash
function hello(){
python 執行shell,#echo "Hello World";
ech "Hello World";
return 3
# return 260
}
hello
echo $?
執行結果
****@****:/******$ bash test.sh
Hello World
0
說明:由于此時未指定返回值,所以以函數最后一條被執行的命令echo "Hello World";的執行狀態作為函數的退出狀態。此時 echo "Hello World";執行成功,所以返回0作為退出狀態碼。
小實驗2
未指定函數返回值,且函數最后一條命令執行失敗(以無效指令為例)
#!/bin/bash
function hello(){
#echo "Hello World";
ech "Hello World";
#return 3
# return 260
}
hello
echo $?
執行結果
****@****:/******$ bash test.sh
test.sh: line 4: ech: command not found
127
說明:此時未指定返回值,所以函數以ech "Hello World";的執行狀態作為hello函數的退出狀態。執行失敗,且未約定特定的返回值用于標識無效指令返回值,所以此時默認以127作為退出狀態返回值。
小實驗3
指定函數返回值,且函數返回值在約定范圍內
#!/bin/bash
function hello(){
echo "Hello World";
#ech "Hello World";
return 3
# return 260
}
hello
echo $?
運行結果
****@****:/******$ bash test.sh
Hello World
3
說明:hello函數指定了返回值為3,由于3在約定的0~255范圍內,所以hello函數的退出狀態值碼從0變更為3(可對比小實驗1)。
小實驗4
指定函數返回值,且函數返回值在約定范圍外
#!/bin/bash
function hello(){
echo "Hello World";
#ech "Hello World";
#return 3
return 260
}
hello
echo $?
返回結果
****@****:/******$ bash test.sh
Hello World
4
說明:hello函數指定了函數返回值為260,由于260超出了0~255,所以需要對指定的返回值進行一次取模運算,所以退出狀態碼由260變更為4。
小實驗5
指定函數返回值,但返回值前發生命令報錯
#!/bin/bash
function hello(){
#echo "Hello World";
ech "Hello World";
return 3
#return 260
}
hello
echo $?
執行結果
****@****:/******$ bash test.sh
test.sh: line 4: ech: command not found
3
說明:hello函數中一條命令執行報錯并不會影響后續代碼的執行,此時hello的函數返回值為指定的3。
小實驗6
在小實驗5的代碼運行以后再次輸入echo $?得到的還會是3么?
代碼與運行結果
****@****:/******$ 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函數指定了退出狀態碼,所以第一次輸出的退出狀態碼為指定的整數3;第二次退出狀態碼則取腳本中最后一條命令echo $?命令的執行狀態,由于腳本中的echo $?成功執行,所以第二次讀取的退出狀態碼為0。
二、利用退出狀態碼實現命令的重試
思路:
1、 利用退出狀態碼,可以判斷命令是否成功執行
2、 利用循環語句,可以實現命令的重試
3、 如果只設置退出狀態碼為0作為唯一的循環退出條件,可能出現死循環,所以最好增加最大重試次數的控制邏輯
4、$?是一個即使變化的值,如果需要多次使用,最好賦值給一個變量
代碼
#! /bin/sh
count=0 #記錄重試次數
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
運行結果
****@****:/******$ 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 ---------------
說明:當退出狀態碼非0時,代碼中“[ 0 -eq 0 ]”和“[${flag}-eq 0 ]”部分實現了重試功能;“[${count}-eq 6 ]”部分實現了對重試邏輯不得超過6次的控制。
三、總結
Shell退出狀態碼:
1、 假如沒有指定返回值,那么會用腳本的最后一個命令的執行狀態,作為退出的狀態碼,支持用exit命令指定退出碼。退出的狀態碼范圍是0~255,如果自定義的退出碼不在范圍內,會對其執行取模運算;
2、 假如執行的是一個有返回值的函數或者程序,那么執行結束的返回值會被當做當前函數或程序的退出狀態值。
到此這篇關于Shell退出狀態碼及其應用詳解的文章就介紹到這了,更多相關Shell退出狀態碼內容請搜索WEB開發者以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持WEB開發者!
暫無相關信息
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态