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 TfirstError
和secondError
的内容是不相关的。他只是想让这个函数按顺序调用它们,直到失败,然后返回退出状态。我建议|124; 124; return
,而不是|return$?
,因为$?
是默认的返回值。那么有更好的方法来设置if语句吗t测试失败的测试?如果我删除“!”则它将错误测试视为失败,因此不会继续执行“then”语句。如果看不到firstError
和secondError
,我几乎无法判断,我们只能猜测您是否提供了显式返回,或者返回是否只是每个命令中最后一个命令的返回。请提供。@ZaneRodnick Smith我已更新了答案,以显示如何执行您想要的操作。@DavidC.Rankin TfirstError
和secondError
的内容是不相关的。他只是希望此函数按顺序调用它们,直到其中一个失败,然后返回退出状态。我建议使用|124; return
,而不是|return$?
,因为$?
是默认的返回值。