• 【shell笔记】 $?返回值0表示真,1表示假+解释


    $?与函数

    在学习 Shell函数 结合 Shell 传递参数 时,我学习到 $?

    参数 说明
    $? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。

    例如:

    
    

    return [数字状态值]

    但是,有个限制,就是函数的返回值必须是数字!

    #!/bin/bash
    
    # 注意:此例为错误示例,是为了说明函数返回只能为数字
    # 定义名为 func 的无参函数,返回值设为字符串
    func() {
      return "ok"
    }
    
    # 调用函数 func
    func
    # 打印“返回值”
    echo $?
    

    执行该 shell 脚本时,报错:

    test.sh: line 6: return: ok: numeric argument required
    

    return "ok" 是不合法的,return 命令需要跟随数字参数。

    exit [数字状态值]

    类似地,还有 exit 命令:exit [状态值]
    比如,执行下面这段 shell 脚本:

    #!/bin/bash
    
    func() {
      exit -1
    }
    
    func
    # 事实上,不会执行以下这条命令,也不会打印出值来,
    # 因为 func 函数调用 exit 命令使得程序退出目前的shell
    echo $?
    

    在 Linux 系统上的操作结果如下:

    [root@hostname workdir]# sh test.sh
    [root@hostname workdir]# echo $?
    255
    

    状态码

    查阅资料:https://tldp.org/LDP/abs/html/exitcodes.html#EXITCODESREF 我们得知:

    状态码 描述
    0 命令成功结束
    1 通用未知错误
    2 误用Shell命令
    126 命令不可执行
    127 没找到命令
    128 无效退出参数
    128+x Linux信号x的严重错误
    130 命令通过Ctrl+C控制码越界
    255 退出码越界

    综上所述:

    1. 在C语言中,都是0为假,1为真;
    2. 而在Shell脚本语言中,状态码0表示成功(可以理解为真),其他状态码(包括1)表示错误(可以理解为假);

    其实状态码的这种思想,我们也经常用在Java Web开发设计接口返回码时。

    我测试的其他一些情况

    [root@hostname workdir]# [1]
    -bash: [1]: command not found
    [root@hostname workdir]# [ 1 ]
    [root@hostname workdir]# echo $?
    0
    [root@hostname workdir]# [ 0 ]
    [root@hostname workdir]# echo $?
    0
    [root@hostname workdir]# [ ]
    [root@hostname workdir]# echo $?
    1
    
    • 第一个例子说明:shell脚本中的[ ]条件语句两端必须有空格 即 [空格conditon空格]
    • [ 0 ] 和 [ 1 ] 作为条件时都为真

    为此,我还特地再测试了一下 if 语句:

    #!/bin/bash
    
    # 满足if条件,执行相应的命令
    if [ 0 ]
    then
    echo 'true'
    fi
    

    执行这段shell脚本,返回结果为 true:

    [root@hostname workdir]# sh test.sh
    true
    

    如果想要写一个死循环,可以写作 while [ 1 ] 也可以写作 while true

    参考文档

  • 相关阅读:
    JavaScript 执行机制
    前端问题总结
    【2020 -02- 07】组件与模板
    【2020-02-07】组件与模板
    【2020-01-23】组件与模板 -- 模板语法
    关于java.lang.UnsatisfiedLinkError的处理
    两个Activity传递数据和对象
    Android Activity为什么要细化出onCreate、onStart、onResume、onPause、onStop、onDesdroy这么多方法让应用去重载?(转)
    通过Android Studio 导出Jar包
    关于AccessibilityService的用法(转)
  • 原文地址:https://www.cnblogs.com/kendoziyu/p/16263637.html
Copyright © 2020-2023  润新知