Bash函数中的返回值

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


function fun1(){

  return 34

}

function fun2(){

  local res=$(fun1)

  echo $res

}

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


慕的地6264312
浏览 892回答 3
3回答

慕标5832272

尽管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将只运行fun2,如果fun1返回一个0值。默认返回值是函数中最后执行的语句的退出值。

米脂

$(...)捕获其中包含的命令发送到stdout的文本。return不输出到标准输出。$?包含最后一个命令的结果代码。fun1 (){  return 34}fun2 (){  fun1  local res=$?  echo $res}

胡子哥哥

Bash中的函数与其他语言中的函数不同;它们实际上是命令。因此,函数的使用就好像它们是从您的路径中获取的二进制文件或脚本一样。从程序逻辑的角度来看,应该没有任何区别。Shell命令是通过管道(也称为流)连接的,而不是像“真实”编程语言中那样的基本或用户定义的数据类型。没有像命令的返回值这样的东西,可能主要是因为没有真正的方法来声明它。它可能出现在手册页或--help命令的输出中,但两者都是人类可读的,因此会随风而逝。当命令想要获取输入时,它将从其输入流或参数列表中读取该命令。在这两种情况下,都必须解析文本字符串。当命令想要返回某些内容时,它必须将echo其返回到其输出流。另一种常用的方法是将返回值存储在专用的全局变量中。写入输出流更清晰,更灵活,因为它还可以接收二进制数据。例如,您可以轻松返回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正如其他人在该线程中编写的一样,调用者也可以使用命令替换$()来捕获输出。并行地,该函数将“返回” gpg(GnuPG)的退出代码。将退出代码视为其他语言所没有的奖励,或者视您的性格而定,将其作为shell函数的“ Schmutzeffekt”。按照惯例,此状态为0表示成功,否则为1-255范围内的整数。为了明确起见:(return如exit)只能接受0-255之间的值,而0以外的值不一定是错误的,正如经常断言的那样。当您不提供显式值时return,状态取自Bash语句/函数/命令中的最后一条命令,依此类推。因此,总有一种状态,return这只是提供状态的一种简便方法。
打开App,查看更多内容
随时随地看视频慕课网APP