Shell 中运行的命令会使用0-255之间的整数值,作为退出状态码,并以此来告知shell该命令执行的状态。通常情况下,约定0代表命令成功结束,非0代表程序非正常退出。

典型退出状态码及其含义

退出状态码

含义

0

命令运行成功

1

通知未知错误

2

误用shell命令

126

命令不可执行

127

没有找到命令

128

无效退出参数

128+x

linux信号x的严重错误

130

命令通过Ctrl+C终止

255

退出状态码越界

一、退出状态码的小实验

小实验1

未指定函数返回值,且函数最后一条命令执行成功

#!/bin/bash

function hello(){

#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开发者!

暂无相关信息

python状态码及其含义_Shell退出状态码及其应用详解相关推荐

  1. 【Python】基金/股票 最大回撤率计算与绘图详解(附源码和数据)

    如果你想找的是求最大回撤的算法,请跳转:[Python] 使用动态规划求解最大回撤详解 [Python]基金/股票 最大回撤率计算与绘图详解(附源码和数据) 0. 起因 1. 大成沪深300指数A 5 ...

  2. python硬件交互_对Python的交互模式和直接运行.py文件的区别详解

    对Python的交互模式和直接运行.py文件的区别详解 看到类似C:\>是在Windows提供的命令行模式,看到>>>是在Python交互式环境下. 在命令行模式下,可以执行p ...

  3. Python字符串对齐方法(ljust()、rjust()和center())详解

    Python字符串对齐方法(ljust().rjust()和center())详解 Python str 提供了 3 种可用来进行文本对齐的方法,分别是 ljust().rjust() 和 cente ...

  4. Python零基础速成班-第14讲-Python处理Excel和Word,使用openpyxl和docx包详解,图表入门

    Python零基础速成班-第14讲-Python处理Excel和Word,使用openpyxl和docx包详解,图表入门 学习目标 Python处理Excel(使用openpyxl包).图表入门\ P ...

  5. python爬取图片-Python爬取网页中的图片(搜狗图片)详解

    前言 最近几天,研究了一下一直很好奇的爬虫算法.这里写一下最近几天的点点心得.下面进入正文: 你可能需要的工作环境: Python 3.6官网下载 本地下载 我们这里以sogou作为爬取的对象. 首先 ...

  6. python3d动态图-Python图像处理之gif动态图的解析与合成操作详解

    本文实例讲述了Python图像处理之gif动态图的解析与合成操作.分享给大家供大家参考,具体如下: gif动态图是在现在已经司空见惯,朋友圈里也经常是一言不合就斗图.这里,就介绍下如何使用python ...

  7. python画椭圆-python opencv圆、椭圆与任意多边形的绘制实例详解

    圆形的绘制 : OpenCV中使用circle(img,center,radius,color,thickness=None,lineType=None,shift=None)函数来绘制圆形 impo ...

  8. python编译器怎么运行不在路径中的py文件_对python当中不在本路径的py文件的引用详解...

    众所周知,如果py文件不在当前路径,那么就不能import,因此,本文介绍如下两种有效的方法: 方法1: 修改环境变量,在~/.bashrc里面进行修改,然后source ~/.bashrc 方法2: ...

  9. python类继承中构造方法_第8.3节 Python类的__init__方法深入剖析:构造方法与继承详解...

    第8.3节Python类的__init__方法深入剖析:构造方法与继承详解 一.    引言 上两节介绍了构造方法的语法及参数,说明了构造方法是Python的类创建实例后首先执行的方法,并说明如果类没 ...

最新文章

  1. VBscript.Encode 解码器
  2. 央视再次点赞阿里云ET城市大脑,树立用人工智能治理城市的标杆
  3. WinXP登录时不用输入用户名和密码,自动登录系统
  4. spark RDD详解及源码分析
  5. java xsd 解析 xml文件_Java针对XSD文件验证XML文件的最佳方法是什么?
  6. 学姐面了美团阿里京东的面经
  7. jenkins配置ant使用方法
  8. 25 SD配置-主数据-信用管理-定义信用段
  9. 深入理解SpringBoot (4)
  10. 【Oracle】创建概要文件
  11. 转载 :sql server 2005 无法删除数据库 #Test,因为该数据库当前正在使用
  12. 文件夹1KB快捷方式(暴风一号)病毒的解决办法
  13. 简单无聊的Minecraft主世界与地狱坐标转换器
  14. 达梦数据库 开发版试用时间限制
  15. android 信息添加附件功能,网易邮箱Android新版 添加附件可直接预览
  16. 336高校毕业设计选题
  17. FineReport报表工具如何实现报表查询和分页显示
  18. BiliBili下载.flv视频文件重命名
  19. jmeter前后置处理器
  20. 熬过最艰难的日子说说

热门文章

  1. Struts项目中引入了过滤器filter后出现中文乱码情况
  2. 大学计算机四级报名,2016下半年安徽理工大学计算机四级报名
  3. java泛型与c 泛型,Java泛型代码编译与javac,失败与Eclipse Helios
  4. visual studio 自带的 宏 没反应_横山宏科幻动漫模型:插图造型怪异的胡佛战车欣赏...
  5. excel小写转大写公式_喂!这边居然有演示的Excel快捷键!
  6. json格式化和查看工具
  7. CentOS7安装wxWidgets错误解决
  8. Android开发笔记(九十三)装饰模式
  9. Android开发笔记(三十一)SQLite游标及其数据结构
  10. 创建索引时,键列位置的重要性