2014-10-31 88 views
49

我想知道在if语句中检查退出状态以回显特定输出的最佳方法是什么。Bash - 如何使用if语句检查退出状态

我想这是

if [ $? -eq 1 ] 
then 
    echo "blah blah blah" 
fi 

我也有这个问题的是,出口语句是之前的if语句,只是因为它必须有一个退出代码,我知道我在做什么因为出口沃尔明显会退出该计划。

+2

Plaese发表您的完整的脚本(或至少是一个更广泛的范围内)。否则这看起来很好。 – RedX 2014-10-31 13:21:49

+1

如果您需要在两个不同的地方使用某个特定程序调用的退出代码,那么您需要保留它 - 沿着'some_program; RC = $ ?;如果[$ {rc} -eq 1] .... fi;退出$ {rc}' – twalberg 2014-10-31 14:37:11

回答

57

每个运行的命令都有退出状态。

该检查查看在该行运行之前最近完成的命令的退出状态。

如果你想你的脚本来当测试返回true退出(以前的命令失败),那么你把exit 1(或其他)是if块内的echo后。

这就是说,如果你正在运行命令,并希望测试其输出使用以下往往更直截了当。

if some_command; then 
    echo command returned true 
else 
    echo command returned some error 
fi 

或打开,大约用!为否定

if ! some_command; then 
    echo command returned some error 
else 
    echo command returned true 
fi 

不过请注意,无论是那些关心什么错误代码是的。如果你知道你只关心特定的错误代码,那么你需要手动检查$?

+2

@ deadcell4当程序出现故障时需要终止一个shell脚本,下面的习惯用法很有用:'a_command ||' return 1' – gboffi 2014-10-31 13:32:06

+1

@gboffi'return'只适用于函数和源脚本。你需要'退出'为另一种情况(这在功能和源脚本中做得太多)。但是,是的,如果你不需要任何特定的清理或额外的输出,这当然是一个合理的模式。 – 2014-10-31 13:33:49

+0

感谢您的纠正。起初我误解了你的评论,但现在我看到它,**来源**脚本:-) – gboffi 2014-10-31 13:44:11

19

$?是一个像其他任何参数。在最终致电exit之前,您可以保存其使用价值。

exit_status=$? 
if [ $exit_status -eq 1 ]; then 
    echo "blah blah blah" 
fi 
exit $exit_status 
-1
tail /var/log/XXX.log | grep 'to be found' && echo found 
28

注意退出代码!= 0用于报告错误。所以,这是更好地做:的

retVal=$? 
if [ ! $? -eq 0 ]; then 
    echo "Error" 
fi 
exit $retVal 

代替

# will fail for error codes > 1 
retVal=$? 
if [ $? -eq 1 ]; then 
    echo "Error" 
fi 
exit $retVal