我知道如何返回退出代码,但是我想返回在Shell脚本函数中完成的操作的结果,因此最终可以在另一个脚本或函数中使用它。
就像是
var1=$(myfunction)
function2 var1
Run Code Online (Sandbox Code Playgroud)
我的功能可能像A + B = C
我查看了“ return”,但它将返回一个代码,而不是一个值。
我正在研究显示如何编写函数的各种站点,但看不到如何实际返回值。
在C ++中,您将使用返回“变量名”,但是shell脚本不允许这样做。它说该变量不存在(这是逻辑上的,它是在函数中创建的变量,因此释放该函数时,分配给它的内存空间就消失了)。无法使用全局变量,因为该函数可能在一个脚本中,而需要返回值的调用函数可能在另一个脚本中。
正如标题所示,我使用相同的方法将其他脚本的值返回到我的主脚本。
在第二个脚本的末尾,我回显了我想要返回到主脚本的变量:
#!/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!!!
Run Code Online (Sandbox Code Playgroud)
然后在主脚本中,我将几个变量传递给第二个脚本并执行,如下所示:
#!/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
Run Code Online (Sandbox Code Playgroud)
第二个脚本中的 echo 不会打印到屏幕的原因是因为它在 RETURN_VARIABLE 的子 shell 中运行第二个脚本...我知道我对子 shell 的解释很糟糕,但这不是重点...
另外,我知道您可以获取其他脚本,但这可能对其他人有帮助。
myfunction可能类似于A + B = C
只是回显结果:
$ myfunction() { echo $(($1+$2)); }
Run Code Online (Sandbox Code Playgroud)
上面加myfunction了两个数字并回显结果。
然后可以像您一样捕获返回值:
$ var=$(myfunction 12 5)
$ echo $var
17
Run Code Online (Sandbox Code Playgroud)
构造var=$(myfunction)从中捕获标准myfunction并将其保存在中var。因此,当您想从中返回某些内容时myfunction,只需将其发送到standard即可,就像我们echo在上面的示例中所做的那样。
如果希望返回值的格式很仔细,则应考虑使用printfecho代替。
让我们定义一个产生两个输出的函数:
$ f() { echo "output1" ; echo "output2" ; }
$ f
output1
output2
Run Code Online (Sandbox Code Playgroud)
如果要分别获取这些值,最可靠的方法是使用bash的数组:
$ a=($(f))
Run Code Online (Sandbox Code Playgroud)
上面的代码f通过执行,$(f)并将结果保存在名为的数组中a。我们可以a使用declare -p以下命令查看其中的内容:
$ declare -p a
declare -a a='([0]="output1" [1]="output2")'
Run Code Online (Sandbox Code Playgroud)