我写了一个函数:
check_log(){
if [ -f "/usr/apps/appcheck.log" ]
then
return 1
else
return 0
fi
}
然后我在“if”条件下调用此函数:
if [ check_log ];
then
........statements....
fi
这会有用吗?我在这里很困惑,因为bash在成功时返回0,在失败时返回1,但我的函数返回1
并且条件是检查1
/ 0
,它得到1
它应该给出失败,但在我的shell脚本中,条件正在传递。
有人可以解释这个问题吗?
答案 0 :(得分:47)
if [ check_log ];
使用方括号时,您正在调用test
命令。它相当于if test check_log
,它是if test -n check_log
的简写,反过来又意味着“if "check_log"
不是空字符串”。它根本不会调用您的check_log
功能。
将其更改为:
if check_log;
顺便说一下,函数可以更简单地写成:
check_log() {
! [ -f "/usr/apps/appcheck.log" ]
}
函数的返回值是最后一个命令的退出状态,因此不需要显式的return语句。
答案 1 :(得分:3)
如@ john-kugelman所述,一种解决方案(也许是最正确的解决方案)是使用以下语法:
if check_log;
但另一种解决方案是:
if [[ $(check_log; echo $?) -eq 0 ]];
我个人的偏好是后者,因为它促进了条件语句之间的一致性。但缺点是因为它依赖于命令替换,它将分叉子进程(即子shell),而第一种方法则不会。
关于这个主题的有趣读物可以在这里找到:
When does command substitution spawn more subshells than the same commands in isolation?
更新(2017-10-20):为了突破我对第二种方法的偏好,因为这些天我正在执行一项任务,以防止不必要的分叉。第一个解决方案中的语法对于非shell编程并不直观,但它肯定更有效。