首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Bash函数中的返回值

Bash函数中的返回值
EN

Stack Overflow用户
提问于 2013-06-27 15:17:30
回答 6查看 512.6K关注 0票数 442

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

代码语言:javascript
复制
function fun1(){
  return 34
}
function fun2(){
  local res=$(fun1)
  echo $res
}

当我执行fun2时,它没有打印"34“。为什么会这样呢?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2013-06-27 15:19:20

尽管Bash有一个return语句,但您可以用它指定的唯一一件事就是函数自己的exit状态(介于0255之间的值,0表示“成功”)。所以return不是你想要的。

您可能希望将return语句转换为echo语句-这样就可以使用$()大括号捕获函数输出,这似乎正是您想要的。

下面是一个示例:

代码语言:javascript
复制
function fun1(){
  echo 34
}

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

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

代码语言:javascript
复制
function fun1(){
  return 34
}

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

另外,请注意,您可以使用返回值来使用布尔逻辑-类似于fun1 || fun2,只有在fun1返回非fun2值时才会运行0。默认返回值是函数内执行的最后一条语句的退出值。

票数 535
EN

Stack Overflow用户

发布于 2013-06-27 15:24:17

$(...)捕获由中包含的命令发送到标准输出的文本。return不输出到标准输出。$?包含最后一条命令的结果代码。

代码语言:javascript
复制
fun1 (){
  return 34
}

fun2 (){
  fun1
  local res=$?
  echo $res
}
票数 85
EN

Stack Overflow用户

发布于 2013-06-27 16:31:43

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

Shell命令是通过管道(也称为流)连接的,而不是像“真正的”编程语言中那样的基本或用户定义的数据类型。命令没有返回值这样的东西,可能主要是因为没有真正的方法来声明它。它可以出现在手册页上,也可以出现在命令的--help输出中,但这两者都只是人类可读的,因此都会写入到wind中。

当一个命令想要获取输入时,它从它的输入流或参数列表中读取它。在这两种情况下,都必须解析文本字符串。

当一个命令想要返回一些东西时,它必须将它echo到它的输出流中。另一种常用的方法是将返回值存储在专用的全局变量中。写入输出流更清晰、更灵活,因为它还可以接受二进制数据。例如,您可以轻松地返回一个BLOB

代码语言:javascript
复制
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只是提供它的一种简单方法。

票数 79
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17336915

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档