在bash脚本中返回值

我正在使用一个bash脚本,我想执行一个函数来打印返回值:

function fun1(){ return 34 } function fun2(){ local res=$(fun1) echo $res } 

当我执行fun2 ,它不打印“34”。 这是为什么?

虽然bash有一个return语句,但是你可以指定的唯一的东西是函数自己的exit状态(0到255之间的一个值,0表示“成功”)。 所以return不是你想要的。

你可能想把你的return语句转换成echo语句 – 这样你的函数输出可以用$()括号来捕获,这看起来正是你想要的。

这里是一个例子:

 function fun1(){ echo 34 } function fun2(){ local res=$(fun1) echo $res } 

获得返回值的另一种方法(如果你只是想返回一个整数0-255)是$?

 function fun1(){ return 34 } function fun2(){ fun1 local res=$? echo $res } 

另外请注意,您可以使用返回值来使用像fun1 || fun2这样的布尔逻辑 如果fun1返回0值, fun1 || fun2将只运行fun2。 默认返回值是函数内执行的最后一个语句。

$(...)捕获通过内部命令发送到标准输出的文本。 return不输出到标准输出。 $? 包含最后一个命令的结果代码。

 fun1 (){ return 34 } fun2 (){ fun1 local res=$? echo $res } 

Bash中的函数不像其他语言中的函数; 他们实际上是命令。 所以函数就好像它们是从path中获取的二进制文件或脚本一样使用。 从程序逻辑的angular度来看,应该没有什么区别。

Shell命令通过pipe道(akastream)连接,而不是像“真正的”编程语言那样基本或用户定义的数据types。 有没有这样的事情,像一个命令的返回值,可能主要是因为没有真正的方式来宣布它。 它可能出现在man页面或命令的--help输出中,但是两者都只是人类可读的,因此被写入风中。

当一个命令想要input时,它从inputstream或参数列表中读取。 在这两种情况下,文本string都必须被parsing。

当某个命令想要返回某个东西时,必须将其echo到其输出stream中。 另一个经常练习的方法是将返回值存储在专用的全局variables中。 写入输出stream更清晰,更灵活,因为它也可以采用二进制数据。 例如,您可以轻松返回一个BLOB:

 encrypt() { gpg -c -o- $1 # encrypt data in filename to stdout (asks for a passphrase) } encrypt public.dat > private.dat # write function result to file 

正如其他人在这个线程中写的,调用者也可以使用命令replace$()来捕获输出。

同时,该函数将“返回” gpg (GnuPG)的退出代码。 把退出代码想象成其他语言没有的奖励,或者根据你的气质,把它作为shell函数的“Schmutzeffekt”。 按照惯例,这种状态在成功时为0,或者在1-255范围内的其他值为整数。 为了清楚起见: return (如exit )只能取0-255之间的一个值,而非0之外的值不一定是错误,正如经常声明的那样。

当你没有提供一个明确的return值时,状态是从Bash语句/函数/命令中的最后一个命令中获取的,等等。 所以总是有一个地位, return只是一个简单的方法来提供它。

return语句设置函数的退出代码,就像exit对于整个脚本一样。

最后一个命令的退出代码始终在$?可用$? variables。

 function fun1(){ return 34 } function fun2(){ local res=$(fun1) echo $? # <-- Always echos 0 since the 'local' command passes. res=$(fun1) echo $? #<-- Outputs 34 } 

如果在定义函数的脚本中运行,我喜欢执行以下操作:

 POINTER= # used for function return values my_function() { # do stuff POINTER="my_function_return" } my_other_function() { # do stuff POINTER="my_other_function_return" } my_function RESULT="$POINTER" my_other_function RESULT="$POINTER" 

我喜欢这个,因为如果我想的话,我可以在我的函数中包含echo语句

 my_function() { echo "-> my_function()" # do stuff POINTER="my_function_return" echo "<- my_function. $POINTER" } 

bash模式返回标量数组值对象:

如何从Bash函数返回一个string值

Windows上使用数组获取多个返回值的Git Bash

BASH代码:

 #!/bin/bash ##A 6-element array used for returning ##values from functions: declare -a RET_ARR RET_ARR[0]="A" RET_ARR[1]="B" RET_ARR[2]="C" RET_ARR[3]="D" RET_ARR[4]="E" RET_ARR[5]="F" function FN_MULTIPLE_RETURN_VALUES(){ ##give the positional arguments/inputs ##$1 and $2 some sensible names: local out_dex_1="$1" ##output index local out_dex_2="$2" ##output index ##Echo for debugging: echo "running: FN_MULTIPLE_RETURN_VALUES" ##Here: Calculate output values: local op_var_1="Hello" local op_var_2="World" ##set the return values: RET_ARR[ $out_dex_1 ]=$op_var_1 RET_ARR[ $out_dex_2 ]=$op_var_2 } echo "FN_MULTIPLE_RETURN_VALUES EXAMPLES:" echo "-------------------------------------------" fn="FN_MULTIPLE_RETURN_VALUES" out_dex_a=0 out_dex_b=1 eval $fn $out_dex_a $out_dex_b ##<--Call function a=${RET_ARR[0]} && echo "RET_ARR[0]: $a " b=${RET_ARR[1]} && echo "RET_ARR[1]: $b " echo ##----------------------------------------------## c="2" d="3" FN_MULTIPLE_RETURN_VALUES $c $d ##<--Call function c_res=${RET_ARR[2]} && echo "RET_ARR[2]: $c_res " d_res=${RET_ARR[3]} && echo "RET_ARR[3]: $d_res " echo ##----------------------------------------------## FN_MULTIPLE_RETURN_VALUES 4 5 ##<---Call function e=${RET_ARR[4]} && echo "RET_ARR[4]: $e " f=${RET_ARR[5]} && echo "RET_ARR[5]: $f " echo ##----------------------------------------------## read -p "Press Enter To Exit:" 

预期产出:

 FN_MULTIPLE_RETURN_VALUES EXAMPLES: ------------------------------------------- running: FN_MULTIPLE_RETURN_VALUES RET_ARR[0]: Hello RET_ARR[1]: World running: FN_MULTIPLE_RETURN_VALUES RET_ARR[2]: Hello RET_ARR[3]: World running: FN_MULTIPLE_RETURN_VALUES RET_ARR[4]: Hello RET_ARR[5]: World Press Enter To Exit: