从Shell脚本返回一个值,传递到另一个Shell脚本

7
我知道如何返回一个退出代码,但我想返回在Shell脚本函数中执行的操作结果,这样我就可以在另一个脚本或函数中使用它。
像这样:
var1=$(myfunction)

function2 var1

我的函数可能类似于A+B=C。

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

我正在研究各种网站上的函数编写方法,但我不知道如何实际返回值。

在C++中,您可以使用return“变量名”,但shell脚本不允许这样做。它说该变量不存在(这是合理的,因为它是在函数中创建的变量,当函数被释放时,分配给它的内存空间也会消失)。由于函数可能位于一个脚本中,需要返回值的调用函数可能位于另一个脚本中,因此无法使用全局变量。

3个回答

9

我的函数可能像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的数组中。我们可以使用declare -p命令查看a数组的内容:
$ declare -p a
declare -a a='([0]="output1" [1]="output2")'

非常感谢您的回复! - user393267

6

我使用类似的方法来将其他脚本返回的值传递给我的主要脚本,就像标题所示。

在第二个脚本的末尾,我输出我想要返回给主要脚本的变量:

#!/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运行第二个脚本时在子shell中运行...我知道我对子shell的解释很糟糕,但那不是重点...
另外,我知道你可以源化其他脚本,但这可能会帮助其他人。

2
在shell脚本中,你不会返回一个值,而只是通过echo(打印)输出它,调用者将捕获你的脚本/函数的输出来获取返回值。
例如:
dateval=$(date)
echo $dateval
Wed Apr 23 18:35:45 EDT 2014

你可以用你自己的函数或shell脚本替换date


1
谢谢,如果你有多个echo怎么办?这个函数是用来记录数据的,所以我也用echo来实现这个目的。我能区分吗? - user393267

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