Bash 函数没有被调用,除非我回显返回值

标签 bash shell

在我的程序中,我试图从函数返回一个值,返回值是字符串。一切正常(至少有一部分),如果我在返回值后回显该值,但如果我不返回,它甚至没有调用该函数……考虑下面的代码……

#!/bin/bash

function get_last_name() {
    echo "Get Last Name"
    ipath=$1

    IFS='/'
    set $ipath
    for item
            do
                    last=$item
            done

    echo $last
}

main() {
    path='/var/lib/iscsi/ifaces/iface0'
    current=$(get_last_name "$path")
    echo -n "Current="
    echo $current
}


main

它给了我这样的输出

OUTPUT
     Current=Get Last Name iface0

如果我评论 echo $current,那么我什至没有看到“Get Last Name”,这使得得出结论,它甚至没有调用该函数。请让我知道我犯了什么错误。但有一件事我敢肯定,bash 是我见过的最丑陋的语言......

最佳答案

函数在 bash 中没有返回值。当你写作时

current=$(get_last_name "$path")

您没有为 current 分配返回值。您正在捕获 get_last_name 的标准输出(使用 echo 命令编写)并将其分配给 current。这就是为什么您看不到“获取姓氏”的原因;该文本不会到达终端,但会存储在 current 中。


详细解释

让我们先看一下 get_last_name(稍作修改以简化解释):

function get_last_name () {
    ipath=$1

    local IFS='/'
    set $ipath
    for item
    do
        last=$item
    done

    echo "Get Last Name"
    echo $last
}

我在 IFS 之前添加了 local 命令,以便将更改限制在 get_last_name 的主体中,并且我移动了第一个 echo 到最后以强调两个 echo 语句之间的相似性。当 get_last_name 被调用时,它处理它的单个参数(一个包含文件路径的字符串),然后回显两个字符串:“Get Last Name”和文件路径的最后一个组成部分。如果你要从命令行运行执行这个函数,它会看起来像这样:

$ get_last_name /foo/bar/baz
Get Last Name
baz

函数的退出代码将是最后执行的命令的退出代码,在本例中为 echo $last。只要写入成功(几乎肯定会成功),它就会为 0。

现在,我们来看函数 main,它调用 get_last_name:

main() {
    path='/var/lib/iscsi/ifaces/iface0'
    current=$(get_last_name "$path")
    echo -n "Current="
    echo $current
}

就像 get_last_name 一样,main 不会有返回值;它将产生一个退出代码,它是 echo $current 的退出代码。该函数首先在命令替换 ($(...)) 中调用 get_last_name,它将捕获来自 get_last_name 的所有标准输出,并且将其视为字符串。

题外话

注意以下区别:

current=$(get_last_name "$path")

current 的值设置为 get_last_name 的累积标准输出。 (除其他事项外,输出中的换行符被空格替换,但如何处理空格的完整解释是另一天的主题)。这与返回值无关;请记住,退出代码(bash 必须“返回值”的壁橱东西)是一个整数。

current=get_last_name "$path"

甚至不会调用 get_last_name。它会将“$path”解释为命令的名称并尝试执行它。该命令将在其环境中有一个变量 current,其字符串值为“get_last_name”。

重点是,get_last_name 不会“返回”您可以分配给变量的任何内容。它有一个退出代码,并且可以写入标准输出。 $(...) 构造允许您将输出捕获为字符串,然后您可以(除其他事项外)将其分配给变量。

返回main

一旦 current 的值设置为 get_last_name 生成的输出,我们执行 最后两个 echo 语句再次写入标准输出。第一个写“Current=”没有换行符,所以下一个 echo 语句在与第一个相同的行上生成文本。第二个只是回应 current 的值。

当你注释掉 main 的最后一个 echo 时,你并没有阻止 get_last_name 被执行(它已经被执行了) .相反,您只是没有打印 current 变量的内容,get_last_name 的输出被放置在此处而不是终端上。

关于Bash 函数没有被调用,除非我回显返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11476656/

相关文章:

bash - 通过 SSH 传递 Bash 命令——执行变量捕获

linux - 从 bash 脚本将变量重新导出到环境

shell - 在 bash shell 脚本中将字符串转换为字符串的小写部分

python - 将 Python shell 输出写入文件

javascript - 如何在 Bash 中执行 javascript?

javascript - 强制 node.js 使用 bin/bash 而不是 sh

php - PHP exec 调用中的重定向创建空文件

linux - 比较两个文件并将不匹配的数字写入新文件

python - 使用 echo 写入文件的换行符在 shell 中有效,但在 Python 3 中为文字

python - 从 bash : Command not found error 运行 Python 脚本