Como trabalhar com funções em bash

Pretendo deixar mais claro como utilizar funções em shell, também pretendo abordar temas como retorno da função, declaração de constantes, variáveis locais, variáveis globais, argumentos para as funções etc. Espero que essa contribuição possa ajudar algumas pessoas no futuro.

[ Hits: 91.054 ]

Por: Denis Doria em 03/07/2008


Como passar argumentos para a função? E o retorno da função?



Como disse anteriormente, o shell trata uma função como se fosse um comando, ou seja, para se passar os argumentos basta fazer como fazemos todos os dias no terminal:

minha_funcao arg1 arg2 .. argn

O recebimento dos argumentos é feito como se estivéssemos passando estes para um script, temos então que os argumentos serão passados para 'minha_funcao' como $0 $1 .. $n. Não vou falar aqui como tratar os argumentos, vou apenas ensinar como são utilizados, às vezes não precisamos nos preocupar como estes acabam sendo passados, porém podemos querer maior controle sobre os argumentos, e talvez utilizar um getopts seja uma boa solução, mas prefiro não entrar em detalhes aqui.

Vamos "melhorar" um pouco a função 'minha_funcao':

function minha_funcao(){

   for i in $*
   do
      echo $i
   done

}

Agora vamos executá-la:

$ minha_funcao a b c
a
b
c

É bem simples a parte de passagem de argumentos, vamos só ver novamente como o bash armazenou a função:

minha_funcao ()
{
   for i in $*;
   do
      echo $i;
   done
}

Vamos lidar agora com o retorno da função, como a maioria das linguagens o shell tem o famoso 'return' nas suas funções, porém com algumas diferenças que devem ser lembradas.

A primeira coisa a saber é que o 'return' só pode retornar inteiros, não há nenhum outro valor que possa ser usado, isso é uma limitação do shell, se você pensava em retornar strings, números(reais), arrays, bem isso pode ser feito, porém não com o return.

Para ser mais exato a função do 'return' fica muito parecida com uma função boolean em C, no nosso caso vamos usar um esquema desses, mais precisamente '0' funcionou, '1' não funcionou. O valor que é retornado pelo 'return' vai para a variável '?', vamos mostrar um exemplo de uma função que use 'return':

function verdade(){

   [ $1 ] && return 0 || return 1

}

Agora uma execução da função:

$ verdade a
$ echo $?

0
$ verdade
$ echo $?

1

Basicamente essa função retorna 0 se existir um argumento, e retorna 1 caso não exista.

Vamos agora brincar com retornos de outros tipos, vamos modificar a função 'verdade' para o nosso exemplo:

function verdade(){

   [ $1 ] && echo 'verdade' || echo 'mentira'

}

Vamos mostrar a execução:

$ verdade
mentira
$ verdade a
verdade

Agora temos um retorno de qualquer tipo, normalmente armazenamos em uma variável:

$ TRUE=$(verdade)
$ echo $TRUE

mentira

Cuidado ao fazer isso, pois todos os echos serão postos na variável como no exemplo abaixo:

function verdade(){ echo verdade; echo mentira; echo buga; }

Execução:

$ verdade
verdade
mentira
buga
$ TRUE=$(verdade)
$ echo $TRUE

verdade mentira buga

Página anterior     Próxima página

Páginas do artigo
   1. Introdução
   2. Como passar argumentos para a função? E o retorno da função?
   3. Variáveis globais X variáveis locais X constantes
   4. WORKAROUNDs
Outros artigos deste autor

Trabalhar com array no Bash

Leitura recomendada

Como matar um processo - kill, killall, pkill e xkill

Variáveis, if, else e unless em Ruby

Sed - Introdução

As maravilhas do Shell Script

Mostrando dicas ao iniciar o terminal

  
Comentários
[1] Comentário enviado por ux386 em 03/07/2008 - 22:50h

>A primeira coisa que pensei foi em fazer um SORT=$(which sort), essa é a melhor
> solução que encontrei para esse problema.

Assim como existe o "builtin" que podemos usar quando uma função sobrescreve um builtin,
existe também o "command", que sempre chama um comando externo, mesmo que haja uma
função com o mesmo nome.

# uname() { echo "Função."; }
# uname -r
Função.
# command uname -r
2.6.18-4-686

[2] Comentário enviado por arauto em 03/07/2008 - 22:56h

Legal, o artigo, são dicas que valem a pena saber e recordar.

[3] Comentário enviado por roberva em 04/07/2008 - 15:02h

Como o outro, muito bom.
Parabéns amigo pelo conteúdo do ótimo artigo!

[4] Comentário enviado por thuck em 04/07/2008 - 15:18h

Obrigado ux386 pelo comentário, realmente o que vc mostrou funciona muito bem.

Obrigado pelos comentários até agora.

[5] Comentário enviado por albathross em 17/05/2011 - 11:37h

Denis, excelente artigo.

Durante a leitura, surgiu a dúvida neste trecho do artigo:

...

Tudo funcionou como imaginávamos, agora vamos ver como o bash armazenou a função:

minha_funcao ()
{
echo 'minha funcao'
}

...


Saí em busca para sanar a dúvida e encontrei a opção -f do comando declare.
declare. -f "nome da função".

Veja na sequência de comandos:

user@debianMachine:~/shell/funções$ function minha_funcao(){ echo 'minha funcao'; }
user@debianMachine:~/shell/funções$ minha_funcao
minha funcao
user@debianMachine:~/shell/funções$ declare -f minha_funcao
minha_funcao ()
{
echo 'minha funcao'
}


Fonte:
http://unix.derkeiler.com/Newsgroups/comp.unix.solaris/2007-04/msg00957.html
http://www.linuxtopia.org/online_books/advanced_bash_scripting_guide/declareref.html


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts