if语句和调用函数如果使用bash

时间:2013-03-27 19:53:02

标签: bash testing if-statement

我写了一个函数:

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脚本中,条件正在传递。

有人可以解释这个问题吗?

2 个答案:

答案 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编程并不直观,但它肯定更有效。