shell 中執行的命令會使用0-255之間的整數值,作為退出狀態碼,並以此來告知shell該命令執行的狀態。通常情況下,約定0代表命令成功結束,非0代表程式非正常退出。
典型退出狀態碼及其含義
退出狀態碼
含義命令執行成功
通知未知錯誤
誤用shell命令
www.cppcns.com
命令不可執行
沒有找到命令
無效退出引數
128+x
linux訊號x的嚴重錯誤
命令通過ctrl+c終止
退出狀態碼越界
小實驗1
未指定函式返回值,且函式最後一條命令執行成功
#!程式設計客棧/bin/bash
function hello()
hello
echo $?
執行結果
****@****:/******$ bash test.sh
hello world
0說明:由於此時未指定返回值,所以以函式最後一條被執行的命令echo "hello world";的執行狀態作為函式的退出狀態。此時 echo "hello world";執行成功,所以返回0作為退出狀態碼。
小實驗2
未指定函式返回值,且函式最後一條命令執行失敗(以無效指令為例)
#!/bin/bash
function hello()
hello
echo $?
執行結果
****@****:/******$ bash test.sh
test.sh: line 4: ech: command not found
127說明:此時未指定返回值,所以函式以ech "hello world";的執行狀態作為hello函式的退出狀態。執行失敗,且未約定特定的返回值用於標識無效指令返回值,所以此時預設以127作為退出狀態返回值。
小實驗3
指定函式返回值,且函式返回值在約定範圍內
#!/bin/bash
function hello()
hello
echo $?
執行結果
****@****:/******$ bash test.sh
hello world
3說明:hello函式指定了返回值為3,由於3在約定的0~255範圍內,所以hello函式的退出狀態值碼從0變更為3(可對比小實驗1)。
小實驗4
指定函式返回值,且函式返回值在約定範圍外
#!/bin/bash
function hello()
hello
echo $?
返回結果
****@****:/******$ bash test.sh
hello world
4說明:hello函式指定了函式返回值為260,由於260超出了0~255,所以需要對指定的返回值進行一次取模運算,所以退出狀態碼由260變更為4。
小實驗5
指定函式返回值,但返回值前發生命令報錯
#!/bin/bash
function hello()
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()
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
datflag=$?
echo "\$?"=$
if [ $ -eq 0 ]; then
echo "--------------- job complete ---------------"
break;
else
count=$[ $+1 ]
if [ $ -eq 6 ];then
echo "--------------- job failed ---------------"
break;
fiecho "...............error occur, retry in 60 seconds,count=$ .........."
# sleep 60
fidone
執行結果
****@****:/******$ 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 ]」和「[$-eq 0 ]」部分實現了重試功能;「[$-eq 6 ]」部分實現了對重試邏輯不得超過6次的控制。
shell退出狀態碼:
1、 假如沒有指定返回值,那麼會用指令碼的最後乙個命令的執行狀態,作為退出的狀態碼,支援用exit命令指定退出碼。退出的狀態碼範圍是0~255,如果自定義的退出碼不在範圍內,會對其執行取模運算;
2、 假如執行的是乙個有返回值的函式或者程式,那麼執行結束的返回值會被當做當前函式或程式的退出狀態值。
shell退出狀態碼
shell中執行的命令使用退出狀態碼 exit status 告訴shell它已經執行完畢。退出狀態碼是乙個0 255的整數值,在命令結束時傳給shell。可以捕獲這個值並在指令碼中使用。按照慣例,乙個成功結束的命令的退出狀態碼是0。如果乙個命令結束時有錯誤,退出狀態碼就是乙個正數值。狀態碼及描述 ...
Shell 退出狀態
退出狀態 每一條命令,不管是內建的 shell函式,還是外部的,當它退出時,都會返回乙個小的整數值給引用它的程式。這是大家所熟知的程式的退出狀態 exit status 在shell下執行程式時,有許多方式可取用程式的退出狀態。退出狀態值 退出狀態為0 表示成功,也就是程式執行完成且未遭遇任何問題。...
linux 退出狀態碼
在linux狀態中,每當命令執行完成後,系統都會返回乙個退出狀態。該退出狀態用乙個整數值表示,用於判斷命令執行的正確與否。最後一次執行命令的退出狀態值被儲存在內建變數 中,所以,可以通過echo語句測試命令是否執行成功。一般來講,退出狀態 0 表示正常執行,沒有遭遇任何問題。其他非零的狀態碼均表示失...