根据前面的命令结果优雅地构造测试和分支

时间:2012-02-23 17:38:09

标签: bash

我正在寻找一种优雅的方法来测试最后执行的命令和分支的结果,具体取决于结果。我想要构建的构造如下:

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 ]丑陋。

4 个答案:

答案 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。只有当您对成功或失败感兴趣时,它才有用。