为什么我的函数调用在下面的 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) 才能完成测试。