为什么我的函数调用在返回布尔值时不起作用?

为什么我的函数调用在返回布尔值时不起作用?

为什么我的函数调用在下面的 if 条件下没有计算为布尔值?

从函数调用返回时是否必须使用数字作为布尔值?

#!/bin/bash
#Script to wait for log file to start and open it using less
function is_log_started()
{
        if test -f "log/server.log"; then
                return true
        fi
        return false
}

if [ is_log_started = true ]; then
        echo "log started"
fi

答案1

shell 函数只能返回 0 到 255 之间的整数。这与适用于可执行文件的限制相同。如果传递非数字参数,不同的 shell 会有不同的反应; bash 确实打印出错误消息。

$ bash -c 'f () { return true; }; f; echo $?'                    
bash: line 0: return: true: numeric argument required
2

传递 0 表示 true,传递 1 到 125 之间的任何值表示 false,与退出程序时相同。 126 到 255 之间的值也是 false,但它们具有常规含义(无法启动程序,或程序被信号终止)。

function is_log_started()
{
        if test -f "log/server.log"; then
                return 0
        fi
        return 1
}

但这是一种复杂的写作方式

function is_log_started
{
        test -f "log/server.log"
}

shell 函数的返回状态是执行的最后一条语句的返回状态。

你的测试也是错误的。[ is_log_started = true ]测试is_log_started和是否true是同一字符串。要测试函数调用的返回状态是否为 true,只需调用该函数即可。每个 shell 命令都已经是一个布尔值:如果命令返回 0,则为 true,否则为 false。

function is_log_started
{
        test -f "log/server.log"
}
if is_log_started; then
    echo "log started"
fi

答案2

您可能已经知道这一点,但您可以完全删除该功能并仅使用:

if [ -f "log/server.log" ] ; then echo "log started" ; fi

答案3

正如所写,您正在比较字符串“is_log_started”和“true”,后者始终为假。

你的测试应该是:

if is_log_started; then

并且您的函数实际上应该返回 true (0) 或 false (例如 1) 才能完成测试。

相关内容