我正在寻找一种优雅的方法来测试最后执行的命令和分支的结果,具体取决于结果。我想要构建的构造如下:
if /bin/true ; then
do_stuff
fi
当我们想要测试成功时,这很有用。但是我怎样才能测试失败?当我进行密集错误检查时,我想要做的就是相当于:
if ! /bin/true ; then
do_error_handling
fi
到目前为止,我找到的最佳解决方案是在我的脚本中定义两个简单的宏:
onSuccess() { [[ $? -eq 0 ]]; }
onError () { [[ $? -ne 0 ]]; }
然后我可以做这样的事情:
some_command
if onError ; then
# error handling block
fi
但我更喜欢使用bash中内置的东西,所以我不必在我编写的每个脚本中复制这些宏。
我的这个“问题”涉及到我想写的代码风格。我想逃避重复的if [ $? -ne 0 ]
丑陋。
答案 0 :(得分:1)
如果你想建立:
if /bin/true ; then
do_stuff
fi
尝试:
if /bin/true ; then # success
do_nothing
else # failure / error
do_stuff
fi
答案 1 :(得分:1)
有时你可以使用它:
first_command && command_if_true || command_if_false
有关相关陷阱,请参阅this。基本上:command_if_true
返回false
会打破它。
这是一种解决方法(我认为):
( first_command && command_if_true || /bin/true ) || command_if_false
但是,它是否值得,或者比直接测试更好看,是主观的。
答案 2 :(得分:1)
基本上,
if something
then :
# nothing (colon on previous line is a no-op command)
else
abcdef
endif
相当于
( something || abcdef )
答案 3 :(得分:1)
找到它。我已经知道了||运营商,但我还没想过把它与大括号结合起来。
/bin/false || {
echo err handling
echo more handling
}
或
/bin/true && {
echo stuff on success
echo more stuff
}
此构造的目的不是替换if..else。只有当您对成功或失败感兴趣时,它才有用。