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.106 ]

Por: Denis Doria em 03/07/2008


Variáveis globais X variáveis locais X constantes



Variáveis globais são aquelas que podem ser vistas por qualquer função, e/ou por qualquer parte do script.

Variáveis locais são usadas somente dentro de uma função e tem precedência sobre as variáveis globais, isso quer dizer que se declararmos VAR globalmente, e depois declararmos VAR localmente, o shell usará a variável local, lembre-se disso.

Constante, como o próprio nome diz, é uma constante, ela não pode ter seu valor alterado de nenhuma forma no decorrer da execução do script.

Para criarmos uma variável global basta declararmos normalmente a variável, exemplo:

TRUE='0'
FALSE='1'

Com isso as duas variáveis acima podem ser vistas em qualquer lugar do código.

Para criamos uma variável local devemos primeiro declará-las dentro de uma função, e antes do nome da variável devemos usar a palavra local, exemplo:

function minha_funcao(){

   local TRUE='verdade'
   local FALSE='falso'
   echo $TRUE
   echo $FALSE

}

Vamos ver o funcionamento da precedência:

$ TRUE='0'

$ FALSE='1'

$ function minha_funcao(){ local TRUE='verdade'; local FALSE='falso'; echo $TRUE; echo $FALSE; }
$ echo $TRUE

0
$ echo $FALSE
1
$ minha_funcao
verdade
falso

O uso de variáveis locais é muito importante, pois assim facilita a reutilização do código, além de ajudar na criação de uma biblioteca de funções, pois usando variáveis locais você evitará o conflito entre variáveis, então é altamente recomendado que sempre que for criar uma variável dentro de uma função que ela seja local, evite o máximo possível o uso de variáveis globais.

Vamos agora ver um pouco sobre as constantes. As constantes podem estar em qualquer parte do código, porém assim como as variáveis globais é preferível que elas sejam declaradas no começo do código, isso se aplica as funções, ou seja, se precisar de uma constante coloque-a no começo da função e de preferência sendo uma constante local.

Para se declarar uma constante devemos fazer:

declare -r <nome_da_constante>=<valor>

Exemplo:

declare -r CONSTANTE='sempre igual'

O comando declare é uma função interna do bash, há outras opções, mas novamente prefiro não entrar em detalhes. No nosso caso a opção '-r', diz que a variável é somente leitura (readonly). Vamos ver o que ocorre se tentamos mudar ou deletar uma constante:

$ declare -r CONSTANTE='sempre igual'
$ CONSTANTE='mude'

bash: CONSTANTE: readonly variable
$ unset CONSTANTE
bash: unset: CONSTANTE: cannot unset: readonly variable

Para declararmos uma constante local fazemos:

function minha_funcao(){

   local -r TRUE='verdade'
   local -r FALSE='falso'
   echo $TRUE
   echo $FALSE
   TRUE='nem vem'
   FALSE='isso ai cara'

}

A execução resultante é:

$ minha_funcao
verdade
falso
bash: TRUE: readonly variable

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

Monitoramento automático de logs e alertas por e-mail - Fácil e explicado

Introdução ao Shell Script

Slackware - Script de instalação de programas

Linguagem Lua - Introdução ao Aprendizado da Linguagem

Enviar e-mail pelo terminal com mutt

  
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