Shell退出狀態碼及其應用詳解

2022-09-26 13:24:25 字數 4355 閱讀 1749

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 表示正常執行,沒有遭遇任何問題。其他非零的狀態碼均表示失...