Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
除非我回显返回值,否则不会调用Bash函数_Bash_Shell - Fatal编程技术网

除非我回显返回值,否则不会调用Bash函数

除非我回显返回值,否则不会调用Bash函数,bash,shell,Bash,Shell,在我的程序中,我试图从函数返回一个值,返回值是字符串。如果我在返回值时回显该值,则一切正常(至少在某些部分),但如果我不返回,则它甚至不调用函数。。。。考虑下面的代码……/P> #!/bin/bash function get_last_name() { echo "Get Last Name" ipath=$1 IFS='/' set $ipath for item do last=$i

在我的程序中,我试图从函数返回一个值,返回值是字符串。如果我在返回值时回显该值,则一切正常(至少在某些部分),但如果我不返回,则它甚至不调用函数。。。。考虑下面的代码……/P>
#!/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")
您没有将返回值分配给
当前
。您正在捕获
get_last_name
(使用
echo
命令编写)的标准输出,并将其分配给
current
。这就是为什么你看不到“获取姓氏”;该文本不会发送到终端,而是存储在
current


详细说明 让我们先浏览一下
get_last_name
(稍作修改以简化解释):

我在
IFS
之前添加了
local
命令,因此更改仅限于
get_last_name
的主体,并将第一个
echo
移到末尾,以强调两个
echo
语句之间的相似性。调用
get\u last\u name
时,它处理其单个参数(一个包含文件路径的字符串),然后回显两个字符串:“get last name”和文件路径的最后一个组件。如果要从命令行运行execute此函数,它将显示如下所示:

$ get_last_name /foo/bar/baz
Get Last Name
baz
函数的退出代码将是最后执行的命令的退出代码,在本例中为
echo$last
。只要写入成功(几乎可以肯定会成功),该值将为0

现在,我们来看一下函数
main
,它调用
get\u last\u 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\u last\u name
的累积标准输出。(除其他事项外,输出中的换行符将替换为空格,但关于如何处理空格的完整解释将是另一天的主题)。这与返回值无关;记住,退出代码(壁橱的东西
bash
必须“返回值”)是一个整数

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

关键是,
get\u last\u name
不会“返回”任何可以分配给变量的内容。它有一个退出代码,可以写入标准输出。
$(…)
构造允许您将输出捕获为字符串,然后可以(除其他外)将其分配给变量

返回到
main

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


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

有什么原因不能只打印
current=“${path##*/}”
?这将剥离所有内容,包括最后一个
/
。另外,您的
for
循环缺少
in
子句。原因是我只知道C/C++并且我不熟悉正则表达式,我不相信bash的这种不一致输出,所以决定编写自己的逻辑。。。。。但如果你认为这是解决问题的方法。。。。我要试试。。。。。非常感谢…这不是正则表达式,而是大括号扩展(
manbash
)即使你不知道bash的大括号扩展,也有外部实用程序
basename
。我想,我现在就用它。。。。。。我只是用这种语言(def,不是我的选择,你看)。。。。这样做会很快变得更好……严格说来,这不是真的。它们确实有数字返回码。如果不返回,它将返回上次执行的命令的退出代码。这些是退出代码。您无法直接从函数中获取这些信息;与其他命令一样,您需要检查
$?
。OP混淆了标准输出和函数返回值的概念,函数返回值可以构成赋值语句的RHS;然后…。我只是想澄清一下,因为答案并不完全准确。
current=get_last_name "$path"