Valor de retorno em uma função Bash

Eu estou trabalhando com um script bash e quero executar uma função para imprimir um valor de retorno:

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

Quando executo fun2, não imprimo "34". Por que este é o caso?

Solução

Embora bash tenha uma declaração de retorno, a única coisa que você pode especificar com ela é a função' o próprio status exit (um valor entre 0 e 255, 0 significado "sucesso"). Então return não é o que você quer.

Você pode querer converter seu comando retorno para um comando echo - dessa forma sua saída de função poderia ser capturada utilizando $() chaves, que parece ser exatamente o que você quer.

Aqui está um exemplo:

function fun1(){
  echo 34
}

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

Outra forma de obter o valor de retorno (se você quiser apenas retornar um número inteiro 0-255) é $?.

function fun1(){
  return 34
}

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

Note também que você pode utilizar o valor de retorno para utilizar lógica booleana como fun1 || fun2 só executará fun2 se fun1 retornar um valor 0. O valor de retorno padrão é o valor de saída da última instrução executada dentro da função.

Comentários (12)

$(...) captura o texto enviado para stdout pelo comando contido dentro. O return não sai para stdout. $? contém o código do resultado do último comando.

fun1 (){
  return 34
}

fun2 (){
  fun1
  local res=$?
  echo $res
}
Comentários (2)

A instrução retorno define o código de saída da função, muito parecido com o saída fará para todo o script.

O código de saída para o último comando está sempre disponível na variável $?.


function fun1(){
  return 34
}

function fun2(){
  local res=$(fun1)
  echo $? # 
Comentários (0)