$?与函数
在学习 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 | 退出码越界 |
综上所述:
- 在C语言中,都是0为假,1为真;
- 而在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