【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

参考文档

  • [Bash基础] 0表示真,1表示假 + 解释
  • shell学习笔记(2)shell脚本 0 1 和真假