重击:错误报告流突然将值从1更改为0

时间:2018-06-26 21:00:58

标签: bash unix

我正在为课堂编写一些有关错误报告的代码,但遇到一个奇怪的问题,我的老师无法弄清楚。看起来像这样。

function errorCheck(){
if ! firstError $*
then 
return $?
elif ! secondError $*
then
return $?
fi

其中firstError和secondError是检查某些错误情况的其他函数。然后,该返回值将输入另一个函数,该函数仅打印出错误文本。这些工作正常,我已将它们从我写的其他工作中删除,并且可以工作。但是,当我运行

bash -x myFunction bad parameters

它表明firstError成功返回了错误代码1,就像应该的那样,但是随后突然返回了0。像这样:

+ errorCheck bad parameters
+ firstError bad parameters
+ return 1
+ return 0
+ main bad parameters

但是,当我这样硬编码时:

function errorCheck(){
if ! firstError $*
then 
return 1
elif ! secondError $*
then
return 2
fi

然后bash报告如下所示:

+ errorCheck bad parameters
+ firstError bad parameters
+ return 1
+ return 1
+ errorReport 1
+ echo 'Error 1'
+ exit 1

这就是我想发生的事情。为什么返回值突然变为0?请保持简单,因为我是bash的新手。

1 个答案:

答案 0 :(得分:2)

!运算符反转命令的退出状态。如果firstError命令返回非零状态,则! firstError的退出状态为0,反之亦然。 $?包含此反向退出状态。

如果要保存原始退出状态,请将if与运行命令分开放置,并将其放入变量中。

firstError $*
status=$?
if [ $status -ne 0 ]
then
    return $status
fi
secondError $*
status=$?
if [ $status -ne 0 ]
    return $status
fi

另一种可能性是使用||运算符:

firstError $* || return
secondError $* || return

如果没有为return提供参数,则默认为$?