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

Bash:错误报告流突然将值从1更改为0,bash,unix,Bash,Unix,我正在为班级写一些关于错误报告的代码,我遇到了一个老师无法解决的奇怪问题。看起来像这样 function errorCheck(){ if ! firstError $* then return $? elif ! secondError $* then return $? fi 其中firstError和secondError是检查特定错误条件的其他函数。然后,返回值输入到另一个函数中,该函数只打印出错误文本。这些工作很好,我从我写的其他工作中得到了它们,它们工作得很好。然而,当我跑的时候

我正在为班级写一些关于错误报告的代码,我遇到了一个老师无法解决的奇怪问题。看起来像这样

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
+ errorCheck bad parameters
+ firstError bad parameters
+ return 1
+ return 1
+ errorReport 1
+ echo 'Error 1'
+ exit 1
然后bash报告如下所示:

function errorCheck(){
if ! firstError $*
then 
return 1
elif ! secondError $*
then
return 2
fi
+ errorCheck bad parameters
+ firstError bad parameters
+ return 1
+ return 1
+ errorReport 1
+ echo 'Error 1'
+ exit 1

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

这个
运算符反转命令的退出状态。如果
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
一个参数,则默认为
$?

运算符反转命令的退出状态。如果
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
没有给出参数,它默认为
$?

注意
错误的参数通常会告诉你一些事情。顺便说一句,请注意
foo$*
基本上总是有问题的。除非你真的知道自己在做什么,否则你应该使用
foo“$@”
。(有时
foo“$*”如果您想将所有参数折叠成一个字符串,那么
可能是合适的;但是不带引号的
foo$*
的行为——将所有参数组合成一个字符串,将该字符串拆分为单个单词,然后将这些单词中的每一个扩展为全局表达式——几乎是普遍不受欢迎的另一方面,请参阅Re:函数声明语法--<代码>函数()({<代码)>以既不兼容的方式组合传统的KSH和POSIX SH函数声明语法;考虑采用POSIX形式的 FoE()({< /代码>,没有<代码>函数> />代码>,或继承的KSH格式<代码>函数Fo{
没有
()
)。注意
错误参数通常会告诉你一些事情。顺便说一句,注意
foo$*
基本上总是有bug。除非你真的,真的知道你在做什么,否则你应该使用
foo“$@”
。(有时
foo“$*”如果您想将所有参数折叠成一个字符串,那么
可能是合适的;但是不带引号的
foo$*
的行为——将所有参数组合成一个字符串,将该字符串拆分为单个单词,然后将这些单词中的每一个扩展为全局表达式——几乎是普遍不受欢迎的另一方面,请参阅Re:函数声明语法--<代码>函数()({<代码)>以既不兼容的方式组合传统的KSH和POSIX SH函数声明语法;考虑采用POSIX形式的 FoE()({< /代码>,没有<代码>函数> />代码>,或继承的KSH格式<代码>函数Fo{
没有
()
)。那么有没有更好的方法来设置if语句来测试失败的测试?如果我删除“!”则它将错误测试视为失败,因此不会继续执行“then”语句。如果看不到
firstError
secondError
,我几乎无法判断,我们只能猜测您是否提供了显式返回,或者返回是否只是每个命令中最后一个命令的返回。请提供。@ZaneRodnick Smith我已更新了答案,以显示如何执行您想要的操作。@DavidC.Rankin T
firstError
secondError
的内容是不相关的。他只是想让这个函数按顺序调用它们,直到失败,然后返回退出状态。我建议
|124; 124; return
,而不是
|return$?
,因为
$?
是默认的返回值。那么有更好的方法来设置if语句吗t测试失败的测试?如果我删除“!”则它将错误测试视为失败,因此不会继续执行“then”语句。如果看不到
firstError
secondError
,我几乎无法判断,我们只能猜测您是否提供了显式返回,或者返回是否只是每个命令中最后一个命令的返回。请提供。@ZaneRodnick Smith我已更新了答案,以显示如何执行您想要的操作。@DavidC.Rankin T
firstError
secondError
的内容是不相关的。他只是希望此函数按顺序调用它们,直到其中一个失败,然后返回退出状态。我建议使用
|124; return
,而不是
|return$?
,因为
$?
是默认的返回值。