从shell脚本返回一个值到另一个shell脚本中

时间:2014-04-23 22:31:57

标签: bash shell

我知道如何返回退出代码,但我想返回在shell脚本函数中完成的操作的结果,所以我最终可以在另一个脚本或函数中使用它。

这样的东西
var1=$(myfunction)

function2 var1

myfunction可能是A + B = C

我查看了“return”,但它会返回一个代码,而不是一个值。

我正在查看显示如何编写函数的各种网站,但我看不出你是如何实际返回值的。

在C ++中,您将使用return“variable name”,但shell脚本不允许这样做。它表示变量不存在(这是逻辑的,它是在函数中创建的变量,因此当释放函数时,分配给它的内存空间消失了)。不能使用全局变量,因为函数可能在一个脚本中,而需要返回值的调用函数可能在另一个脚本中。

3 个答案:

答案 0 :(得分:3)

  

myfunction可能类似于A + B = C

回显结果:

$ myfunction() { echo $(($1+$2)); }

以上myfunction会添加两个数字并回显结果。

然后可以像您一样捕获返回值:

$ var=$(myfunction 12 5)
$ echo $var
17

构造var=$(myfunction)myfunction中捕获标准并将其保存在var中。因此,当您想要从myfunction返回某些内容时,只需将其发送到标准内容,就像我们在上面的示例中使用echo所做的那样。

如果您希望仔细格式化返回值,则应考虑使用printf代替echo。

更多:如何返回多个值

让我们定义一个产生两个输出的函数:

$ f() { echo "output1" ; echo "output2" ; }
$ f
output1
output2

如果你想单独取回这些值,最可靠的方法是使用bash的数组:

$ a=($(f))

以上内容通过f执行$(f),并将结果保存在名为a的数组中。我们可以使用a

查看declare -p中的内容
$ declare -p a
declare -a a='([0]="output1" [1]="output2")'

答案 1 :(得分:3)

我使用相同的sorta方法将其他脚本的值返回到主脚本,如标题所示。

在第二个脚本的末尾,我回显要返回到主脚本的变量:

#!/bin/bash
# This is the Second Script.

# Store the variables passed from the main script:
VAR1_FROM_MAIN_SCRIPT=$1
VAR2_FROM_MAIN_SCRIPT=$2

# Add the 2 variables and store as another variable to return:
RETURN_THIS=$(($VAR1_FROM_MAIN_SCRIPT + VAR2_FROM_MAIN_SCRIPT)) 

# This is the variable you are sending back to the main script:
echo "$RETURN_THIS"    #<---- This won't print to screen!!!

然后在主脚本中,我将几个变量传递给第二个脚本并执行,如下所示:

#!/bin/bash
# This is the Main Script.

PASS_VAR1_TO_SCRIPT=1
PASS_VAR2_TO_SCRIPT=2

# Call the second script and store it's results in this variable:
RETURN_VARIABLE=$(./secondScriptName "$PASS_VAR1_TO_SCRIPT" "$PASS_VAR2_TO_SCRIPT")

# Display the returned variable from the second script:
echo $RETURN_VARIABLE    #<---- Will display 3

第二个脚本中的回显无法打印到屏幕上的原因是,因为它正在RETURN_VARIABLE的子外壳中运行该第二个脚本...我知道我对子外壳的解释很烂,但这不重要。 。
另外,我知道您可以提供其他脚本,但这可能会对其他人有所帮助。

答案 2 :(得分:2)

在shell脚本中,你不返回一个值,只是回显(打印)它,调用者将捕获脚本/函数的输出以获取返回的值。

示例:

dateval=$(date)
echo $dateval
Wed Apr 23 18:35:45 EDT 2014

您可以放置​​函数或shell脚本而不是date