在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: