Valor de retorno en una función Bash

Estoy trabajando con un script bash y quiero ejecutar una función para imprimir un valor de retorno:

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

Cuando ejecuto fun2, no imprime "34". ¿Por qué ocurre esto?

Solución

Aunque bash tiene una sentencia return, lo único que puedes especificar con ella es el propio estado de exit de la función (un valor entre 0 y 255, 0 significa "éxito"). Así que return no es lo que quieres.

Puede que quieras convertir tu declaración return en una declaración echo - de esa manera la salida de tu función podría ser capturada usando llaves $(), que parece ser exactamente lo que quieres.

Aquí hay un ejemplo:

function fun1(){
  echo 34
}

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

Otra forma de obtener el valor de retorno (si sólo quieres devolver un entero 0-255) es $?.

function fun1(){
  return 34
}

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

Además, tenga en cuenta que puede utilizar el valor de retorno para utilizar la lógica booleana como fun1 || fun2 sólo se ejecutará fun2 si fun1 devuelve un valor 0. El valor de retorno por defecto es el valor de salida de la última sentencia ejecutada dentro de la función.

Comentarios (12)

$(...) captura el texto enviado a stdout por el comando que contiene. return no envía el texto a stdout. contiene el código de resultado del último comando.

fun1 (){
  return 34
}

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

La sentencia return establece el código de salida de la función, al igual que exit lo hará para todo el script.

El código de salida del último comando siempre está disponible en la variable $?.


function fun1(){
  return 34
}

function fun2(){
  local res=$(fun1)
  echo $? # 
Comentarios (0)