Bash中的echo和return有什么区别?

8

我知道你可以使用echo在控制台上打印信息。但是我尝试使用返回整数,结果并不理想。

截止目前

function echo_test() {
    echo 1;
}

function output_echo() {
    local result="$(echo_test)";

    if [[ ${result} == 1 ]]; then
        echo great;
    else
        echo nope;
    fi
}

输出是“great”,但存在以下问题:

function return_test() {
    return 1;
}

function output_return() {
    local result="$(return_test)";

    if [[ ${result} == 1 ]]; then
        echo great;
    else
        echo nope;
    fi
}

无法正常工作...并输出“不行”。

我有一个示例,我想了解为什么输出结果没有预期的结果。可以回答一下吗?我已经回答过了,但是如果有人不知道答案或者不愿意回答,为什么要点踩呢? - Rafael
3
这不是愚蠢的问题,而是一个好问题。以后,您可以使用“help”来了解这些shell内置命令,例如“help echo”和“help return”。已点赞。 - kojiro
1个回答

13
你正在混淆两件不同的事情:输出退出状态echo 生成 输出。像$(...)这样的命令替换会捕获该输出,但如果您在没有它的情况下运行命令,则该输出将进入终端。 return 设置 退出状态。这是确定运行if your_function; then ...时采取哪个分支,或者填充$?所使用的内容。
要查看您的return_test函数实际执行操作,可以编写:
return_test() {
    return 1;
}

return_test; echo "Exit status is $?"

此外,请注意可以同时实现以下两点:

myfunc() {
    echo "This is output"
    return 3
}

myfunc_out=$(myfunc); myfunc_rc=$?
echo "myfunc_out is: $myfunc_out"
echo "myfunc_rc is: $myfunc_rc"

... 发出信号:

myfunc_out is: This is output
myfunc_rc is: 3

一个有用的惯用语是在 if 条件语句中嵌入一条赋值语句,以便在捕获输出的同时分支退出状态:


if myfunc_out=$(myfunc); then
  echo "myfunc succeeded (returned 0), with output: [$myfunc_out]"
else rc=$?
  echo "myfunc failed (nonzero return of $rc), with output: [$myfunc_out]"
fi

在这种情况下,它将返回:

myfunc failed (nonzero return of 3), with output: [This is output]

顺便提一下,您可能会注意到,当上面的代码捕获 $? 时,它尽可能接近捕获退出状态的命令,即使这意味着违反了垂直空白的常规约定。这是有意的,以减少在设置和使用 $? 之间意外修改它的日志记录或其他代码更改的可能性。


1
return 语句仅改变函数的退出状态,对其输出没有影响。值得注意的是,你可以同时做到这两点:myfunc() { echo "This is output"; return 3; } 是合法的,它在函数的标准输出中输出了一个字符串,并且返回了一个明确的退出状态(通常,输出可以是任何一串字符,而退出状态只能是数字 -- 典型地,是一个无符号单字节整数)。 - Charles Duffy
那太好了,正是我想知道的。对于这个愚蠢的问题,我很抱歉。因为我来自其他语言,所以让我感到困惑。 - Rafael
我看到了一个关于退出和返回的类似问题,但那不是我想知道的,所以我并不满意。实际上,我想知道如何将返回信息存入变量中。但我仍然需要测试其应用。 - Rafael
1
因此,我已经登陆了https://dev59.com/YWoy5IYBdhLWcg3wJKzR -- 这些问题可能不是那么明显相同的,但是问题并不是在表面上就很明显相同的,这就是我们有重复机制的整个原因,这样人们可以找到他们问题的规范实例,即使需要背景知识才能知道它们确实是相同的问题。我认为没有可能阅读那个答案而不解决这个问题。 - Charles Duffy
1
可能需要提到的一个方面是非常有用的习语 if var=$(func); then ...,它将 func 的输出分配给变量 var 并检查输出状态。 - William Pursell
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接