一个小脚本,[ $status != "success" ] && exit 2
,在 status 值是 success 时,最终的返回状态码是1,而不是0,有点诡异。
排查
这个写法以前在脚本里经常写,稳定运行未出错。对比之前的脚本后发现差异,之前的脚本 exit 是提前退出,后面还有内容;这个脚本exit是上层调用脚本反馈最终结果,exit 是最后一行。
修改脚本后一切正常
|
|
原因分析
使用 bash -x 可以看出差异,
exit 在最后一行
|
|
exit 不在最后一行
|
|
shell 会将最后一条命令的返回状态码作为整个脚本的返回状态码。test 在最后一行时,[ $status != "success" ]
的返回结果非0,后面的 && 内容不会执行,整个脚本结束,脚本返回状态码就是中括号内test命令的反馈状态码。
避坑经验
- 退出用或逻辑
||
,避免用与逻辑&& - 一定要用 && 做退出条件时,不能作为脚本或者函数的最后一条命令
上面脚本改造成||退出
|
|
因为是最后一行,还可以直接省略后面的内容
|
|