我正在使用一个bash脚本,我想执行一个函数来打印返回值:
function fun1(){
return 34
}
function fun2(){
local res=$(fun1)
echo $res
}
当我执行fun2
时,它没有打印"34“。为什么会这样呢?
发布于 2013-06-27 15:19:20
尽管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
返回非fun2
值时才会运行0
。默认返回值是函数内执行的最后一条语句的退出值。
发布于 2013-06-27 15:24:17
$(...)
捕获由中包含的命令发送到标准输出的文本。return
不输出到标准输出。$?
包含最后一条命令的结果代码。
fun1 (){
return 34
}
fun2 (){
fun1
local res=$?
echo $res
}
发布于 2013-06-27 16:31:43
Bash中的函数不同于其他语言中的函数;它们实际上是命令。因此,函数的使用就像它们是从path获取的二进制文件或脚本一样。从你的程序逻辑的角度来看,这应该没有什么区别。
Shell命令是通过管道(也称为流)连接的,而不是像“真正的”编程语言中那样的基本或用户定义的数据类型。命令没有返回值这样的东西,可能主要是因为没有真正的方法来声明它。它可以出现在手册页上,也可以出现在命令的--help
输出中,但这两者都只是人类可读的,因此都会写入到wind中。
当一个命令想要获取输入时,它从它的输入流或参数列表中读取它。在这两种情况下,都必须解析文本字符串。
当一个命令想要返回一些东西时,它必须将它echo
到它的输出流中。另一种常用的方法是将返回值存储在专用的全局变量中。写入输出流更清晰、更灵活,因为它还可以接受二进制数据。例如,您可以轻松地返回一个BLOB:
encrypt() {
gpg -c -o- $1 # Encrypt data in filename to standard output (asks for a passphrase)
}
encrypt public.dat > private.dat # Write the function result to a file
正如其他人在此线程中所写的那样,调用者还可以使用命令替换$()
来捕获输出。
同时,该函数将“返回”gpg
(GnuPG)的退出代码。可以将退出代码看作是其他语言所没有的额外奖励,或者,根据您的性格,可以将其视为shell函数的"Schmutzeffekt“。按照惯例,此状态为0(表示成功)或1-255范围内的整数(表示其他情况)。要明确这一点:return
(像exit
)只能接受0-255之间的值,而不是0的值不一定是错误,正如人们经常断言的那样。
当您没有为return
提供显式的值时,状态取自Bash语句/函数/命令中的最后一个命令,依此类推。所以总会有一个状态,而return
只是提供它的一种简单方法。
https://stackoverflow.com/questions/17336915
复制相似问题