Bash中的嵌套函数调用

Bash中的嵌套函数调用,bash,function,Bash,Function,现在,我正在尝试将一个bash函数调用嵌套在另一个函数调用中(以便将一个函数的输出用作另一个函数的输入)。是否可以像我在这里尝试的那样在bash中嵌套函数调用 首先,我定义了这两个函数: returnSomething() { return 5; } funky () { echo $1; } 然后,我尝试使用一个函数的输出作为另一个函数的输入。 但是,下一条语句不会打印returnSomething的输出。相反,它根本不打印任何内容 funky $returnSomething

现在,我正在尝试将一个bash函数调用嵌套在另一个函数调用中(以便将一个函数的输出用作另一个函数的输入)。是否可以像我在这里尝试的那样在bash中嵌套函数调用

首先,我定义了这两个函数:

returnSomething()
{
    return 5;
}

funky ()
{
  echo $1;
}
然后,我尝试使用一个函数的输出作为另一个函数的输入。 但是,下一条语句不会打印
returnSomething
的输出。相反,它根本不打印任何内容

funky $returnSomething; #Now I'm trying to use the output of returnSomething as the input for funky.
这个怎么样:

function foo() { echo one two three; }
function bar() { echo foo #1: $1 }
bar $( foo ) # ==> foo #1: one
以上有问题,感谢安德森指出。以下是更新:

function foo() { echo one two three; }
function bar() { echo foo $1; }
bar $( foo )
Bash用
command
的输出替换
$(command)
,因此您可以使用
funky$(returnSomething)
传递
funky
的输出。然而,看起来您误解了bash中的
return
;返回值是指示呼叫是否成功的数字。获取bash中最后一个进程的返回状态的方法是
$?

returnSomething
funky $?

你有两个问题。一个是
return
不设置函数的输出,而是设置其退出状态(零表示成功,非零表示失败)。例如,
echo foo
将输出
foo
(加上换行符),但退出状态为
0
。要控制输出,请使用
echo
printf

function returnSomething ()     # should actually be outputSomething
{
    echo 5
}
另一个问题是
$returnSomething
(或
${returnSomething}
)给出了名为
returnSomething
的变量的值:

x=5          # sets the variable x
echo "$x"    # outputs 5
要捕获命令的输出,请使用符号
$(…)
(或
`.`
,但后者更为复杂)。因此:

或者只是:

function funky ()
{
    "$1"          # runs argument as a command
}
funky returnSomething    # prints 5
相反,如果要捕获命令的退出状态,请使用特殊的shell参数
(该参数设置为命令完成时的退出状态):


试着用
funky returnSomething
$returnSomething
是一个变量,不是对函数的调用。
funky$(returnSomething)
@Kevin这似乎没有什么区别:它仍然不打印任何内容。@fedorqui在这种情况下,它只会将字符串
returnSomething
打印到控制台。这是否意味着Bash中的函数基本上不可能返回任何类型的非整数值?是的,您必须打印它并捕获输出,或者设置一个变量(尽管有很多gotcha)这些“gotcha”是什么,特别是?如果将调用放入子shell(作为管道、显式子shell或
$(…)
子shell的一部分),则不会影响调用方的环境。这尤其会让人们陷入循环。你必须在函数之前声明变量。我还没有弄清楚如何将一个函数调用(带参数)嵌套在另一个函数调用中。例如,
(sampleFunction2(sampleFunction1“示例函数1的参数”)
在意外标记sampleFunction1'附近产生
语法错误。有可能进行像这样的嵌套函数调用吗?@AndersonGreen:我不确定我是否理解你的要求;Bash命令比其他语言中的函数支持更多种类的可能交互,因此有多种方法可以将它们组合起来,这些方法都可以称为“嵌套”。我的最佳猜测是,您可能希望捕获示例函数1的命令
sampleFunction1“参数的输出”(而不是像通常那样进入控制台),并且希望将该输出作为参数(参数)传递给函数
sampleFunction2
。是这样吗?如果是这样,您可以编写(continued)(continued)
sampleFunction2“$(sampleFunction1“示例函数1的参数”)”
@AndersonGreen:顺便说一句,所有这些都在Bash参考手册中有详细说明;请参阅。@AndersonGreen:关于双引号:最好用双引号将扩展(如
$(…)
)括起来,这样即使它们的行为不正常并输出与您预期不同的内容,您至少可以确保它们最终会成为正确数量的参数。(考虑类似于
cp foo.txt bar.txt$(baz)
,它应该将
foo.txt
bar.txt
复制到
baz
所说的目录中——但是如果
baz
(假设)出现错误并且根本不打印任何目录,那么这将用
foo.txt
的副本覆盖
bar.txt
function funky ()
{
    "$1"          # runs argument as a command
}
funky returnSomething    # prints 5
function returnSomething ()
{
    return 5
}
function funky ()
{
    "$1"          # runs argument as a command
    echo "$?"     # prints its exit status
}
funky returnSomething    # prints 5