当我们写 shell 脚本将一些离散的逻辑模块串行组合在一起的时候,需要获取业务模块处理(脚本运行,可能是 python 或 java 等)的结果,再根据其返回判断下一步如何处理。shell 针对这种需求,提供了一个变量 $?
,该变量就是用来存放上一个命令/程序执行完的结果。
解决方法
正常情况下,python 或 java 等程序正常执行完后,会返回 0,其它错误会返回非 0 数,对于 python 返回的数值范围为 [0, 255]。
我们先创建简单的 python 脚本 demo.py,代码如下:
import sys
print('check python return value')
shell 脚本如下:
#! /bash/sh
python3 -u demo.py
if [ $? -eq 0 ];then
echo '上一个命令执行成功'
else
echo $?
echo '上一个命令执行失败!'
fi
执行完后,打印如下:
check python return value 上一个命令执行成功
如果将 python 脚本构造成返回非 0(直接返回指定 code 或报错),demo.py 代码修改如下:
import sys
print('check python return value')
a = 0
c = 5 / a
重新执行 demo.sh 脚本,输入如下:
check python return value Traceback (most recent call last): File "demo.py", line 5, in <module> c = 5 / a ZeroDivisionError: division by zero 1 上一个命令执行失败
可以看出 python 程序出错默认会返回 1,也可以通过 sys.exit() 指定返回值,但是需要注意的是如果返回值越界(超出 0-255 范围),它就会在阈值范围内轮回,示例如下:
import sys
print('check python return value')
sys.exit(256)
执行脚本后,输出返回码 0,如下:
check python return value 上一个命令执行成功