2016-12-04 29 views
0

假设我用一个函数在if语句:失败如果条件函数是未定义

if isSomeConditionTrue; then 
    echo "true"; 
else 
    echo "false"; 
fi 

如果isSomeConditionTrue定义这工作得很好。

但是,如果isSomeConditionTrue未被定义,例如,由于错字或缺少导入,它的评估结果为"false",而不是失败。

set -u没有什么区别。

+0

这是一个调试问题;确保定义了“isSomeConditionTrue”。 – chepner

回答

1

我建议你if之前插入这样的:

command_not_found_handle() { false; } 
+0

不幸的是,这似乎并不适用于老版本的Bash。 –

+0

这也只是取代127的正常退出状态,退出状态为1.如果使用足够新的'bash'版本,将'command_not_found_handle'设置为实际退出* shell可能会有用。 – chepner

1

最终,你只需要调试脚本,并确保你有适当的进口,不作错别字。也就是说,有一种方法可以区分一个未定义的命令和一个正常的失败,尽管它可能不是你想在整个脚本中使用的东西。

isSomeConditionTrue 
case $? in 
    127) echo "Command not found" ;; 
    0) echo "Command succeeds" ;; 
    *) echo "Some other problem" ;; 
esac 

退出状态127表示找不到命令。 (请注意,这意味着一个性能良好的程序本身不应返回127的状态;请考虑保留返回值。)

+0

信息丰富,但过于冗长,特别是在组合多个条件函数时。 –