Shell中关于exit 0的那些坑

在 shell 编程中,需慎用 exit 0!

首先必须弄清楚 exit 0 不是 return 0, 区别在于 return 0 用于函数中,表示函数执行成功返回 0;而 exit 0 则代表你当前程序执行成功并且会直接退出当前所执行的脚本或者程序,相反,return -1 一般表示函数执行失败返回错误; exit 1 (或大于 1)表示程序执行失败并退出程序。exit 用来返回进程结束时的状态,一般在父shell中使用 $? 变量来获取子shell 的退出状态,判断子shell是否执行成功。

虽然两者区别很明显,也很容易理解,为什么专门要做一下记录?确实出现了这样的一个错误,本应是在子shell中执行使用 exit 0 和 exit 1 的函数接口,父shell对其进程返回值 { $? } 做判断操作,结果有人直接在环境脚本中加了该函数接口做判断,结果直接导致环境部署失败,显然,悲剧了。。。哈哈,所以想着写篇博客记录一下

注:在接口函数中使用 return,在需要退出执行(子 shell)程序时使用 exit举个小例

#/bin/bash

function check_extern_input()
{
    read param
    if [ "${param}" == "exit 0" ]
    then
        echo "successful exit process right now!"
        exit 0
    elif [ "${param}" == "exit 1" ]
    then
        echo "failed exit process right now!"
        exit 1
    elif [ "${param}" == "return 0" ]
    then
        echo "func normal return, process not exit, Enter go on..."
        return 0
    else
        echo "Input again:"
    fi        
}
while true 
do
    check_extern_input
done

在使用不熟悉的 shell 命令或者语法之前,最好先写个脚本验证后使用,形成自测的好习惯!

ps:shell脚本中exit0和exit1的含义

exit  0:正常运行程序并退出程序;

exit  1:非正常运行导致退出程序;

exit 0 可以告知你的程序的使用者:你的程序是正常结束的。如果 exit 非 0 值,那么你的程序的使用者通常会认为
你的程序产生了一个错误。
在 shell 中调用完你的程序之后,用 echo $? 命令就可以看到你的程序的 exit 值。在 shell 脚本中,通常会根据
上一个命令的 $? 值来进行一些流程控制。0代表程序正确的执行,如下图例子所示:

到此这篇关于Shell中关于exit 0的那些坑的文章就介绍到这了,更多相关Shell exit 0内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Shell中exit和return的区别讲解

    1.exit命令 exit命令是Shell内建命令,用于退出当前Shell进程.使用格式如下: exit [<n>] 可以指定退出状态n,n的取值范围是0-255,一般情况下,0表示正常退出,非零表示异常退出.如果状态码是0-255之外的数值,则会被强制转换为uint8_t类型的数值,比如-1会被转换为255,256会发生类型宽度截断,被转换为0.状态码n可以不指定,默认是上一条命令的退出状态码. 关于状态码值的定义尚未有统一的标准,但是结束程序时随意的指定一个状态码是一个不好的行为,应该使用

  • 了解Powershell中的Exit函数

    Powershell支持"EXIT"关键字,它的范围是基于作用域的,它可能比你想象的工作方式要不同. 让我们来测试下这个函数: 复制代码 代码如下: function test {   'A'   exit   'B' } 当你保存并调用脚本,你将得到: 复制代码 代码如下: PS> C:\Users\Tobias\Documents\PowerShell\test12343.ps1 A 这时"exit"过早的结束了这个函数.可是当你没有保存当前脚本或当你调用

  • exit(-1)或者return(-1)shell得到的退出码为什么是255

    下面我写了一个hello world程序,一起看看吧: // filename: main.c #include <stdio.h> int main(void) { printf("hello wolrd!\n"); return(-); } 编译执行:gcc main.c && ./a.out 现在我们看看在当前shell中返回上一个执行过程的返回值是多少,是 "-1" 吗? inuyasha@inuyasha-Aspire-4741

  • Shell中关于exit 0的那些坑

    在 shell 编程中,需慎用 exit 0! 首先必须弄清楚 exit 0 不是 return 0, 区别在于 return 0 用于函数中,表示函数执行成功返回 0:而 exit 0 则代表你当前程序执行成功并且会直接退出当前所执行的脚本或者程序,相反,return -1 一般表示函数执行失败返回错误: exit 1 (或大于 1)表示程序执行失败并退出程序.exit 用来返回进程结束时的状态,一般在父shell中使用 $? 变量来获取子shell 的退出状态,判断子shell是否执行成功.

  • 详解python中 os._exit() 和 sys.exit(), exit(0)和exit(1) 的用法和区别

    详解python中 os._exit() 和 sys.exit(), exit(0)和exit(1) 的用法和区别 os._exit() 和 sys.exit() os._exit() vs sys.exit() 概述 Python的程序有两中退出方式:os._exit(), sys.exit().本文介绍这两种方式的区别和选择. os._exit()会直接将python程序终止,之后的所有代码都不会继续执行. sys.exit()会引发一个异常:SystemExit,如果这个异常没有被捕获,那

  • Java中BigDecimal与0比较的一个坑实战记录

    目录 前言 问题解决 问题讲解 附:Java BigDecimal中一些其他的坑 总结 前言 在之前做的一个项目中,为了保证BigDecimal在除数 divide时,如果被除数为0,出现java.lang.ArithmeticException: / by zero 报错问题,写了一个对比.具体代码如下: public static BigDecimal getScale(BigDecimal data1,BigDecimal data2,Integer scale){ if(Objects.

  • Linux Shell中的特殊符号和含义简明总结(包含了绝大部份)

    在Linux Shell中有很多的特殊符号,这对于我们写Shell脚本时要特别留意:一方面要知道这些特殊符号的用法,这些符号用好了可以达到事半功倍的效果:但另一方面要避免这些特殊符号的过度使用而导致脚本难以调试.难以阅读. 这些特殊符号罗列出来大致如下: 复制代码 代码如下: # ; ;; . , / / 'string'| ! $ ${} $? $$ $* "string"* ** ? : ^ $# $@ `command`{} [] [[]] () (()) || &~ ~

  • linux shell中的比较符号与特殊符号介绍

    shell字符串比较.判断是否为数字 二元比较操作符,比较变量或者比较数字.注意数字与字符串的区别. 整数比较 -eq 等于,如:if [ "$a" -eq "$b" ] -ne 不等于,如:if [ "$a" -ne "$b" ] -gt 大于,如:if [ "$a" -gt "$b" ] -ge 大于等于,如:if [ "$a" -ge "$b"

  • shell中case的用法学习笔记

    shell中的case语句: 可以把变量的内容与多个模板进行匹配,再根据成功匹配的模板去决定应该执行哪部分代码. 使用格式:case 匹配母板 in模板1 [ | 模板2 ] - ) 语句组 ;;模板3 [ | 模板4 ] - ) 语句组 ;;esaccase语句的匹配是从上往下地匹配顺序.因此,case语句编写的原则是从上往下,模板从特殊到普通.在C语言里,case语句中有default模板,而在shell程序设计中,可能将模板写成*,就可以完成相同的功能. 例1: 复制代码 代码如下: #!

  • Shell中set与shopt命令选项的含义和使用示例

    前言 本文主要给大家介绍了关于Shell中set与shopt命令选项含义与使用的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. set命令选项 set命令作用主要是显示系统中已经存在的shell变量,以及设置shell变量的新变量值.使用set更改shell特性时,符号"+"和"-"的作用分别是打开和关闭指定的模式.set命令不能够定义新的shell变量.如果要定义新的变量,可以使用declare命令以变量名=值的格式进行定义即可. 内置

  • Shell中关于时间和日期的函数总结

    shell下获取系统时间的方法直接调用系统变量 获取今天时期:`date +%Y%m%d` 或 `date +%F` 或 $(date +%y%m%d) 获取昨天时期:`date -d yesterday +%Y%m%d` 获取前天日期:`date -d -2day +%Y%m%d` 依次类推比如获取10天前的日期:`date -d -10day +%Y%m%d` 或n天前的 `date -d "n days ago" +%y%m%d` 明天:`date -d tomorrow +%y

  • linux shell中if的各种判断

    shell编程中使用到得if语句内判断参数 –b当file存在并且是块文件时返回真 -c当file存在并且是字符文件时返回真 -d当pathname存在并且是一个目录时返回真 -e当pathname指定的文件或目录存在时返回真 -f当file存在并且是正规文件时返回真 -g当由pathname指定的文件或目录存在并且设置了SGID位时返回为真 -h当file存在并且是符号链接文件时返回真,该选项在一些老系统上无效 -k当由pathname指定的文件或目录存在并且设置了"粘滞"位时返回真

随机推荐