Criando funções em scripts bash (Linux/Bash)

Enquanto escrevia um script particularmente grande, percebi que precisaria repetir/reutilizar partes do código e duplicar código é algo que me irrita profundamente. Então pesquisei sobre funções em scripts bash e fiquei semi-feliz com o resultado da pesquisa. Neste post, vou compartilhar o básico sobre como criar e utilizar funções nos scripts bash.

Antes que você saia correndo para refatorar todos aqueles bash scripts que você tem, vale uma nota importante: Diferente das outras linguagens, os bash scripts não permitem retornar valores. Você pode retornar um valor numérico indicando sucesso (sucesso = zero) ou falha (qualquer outro numero).

Caso você tente retornar uma string, vai ser agraciado pela seguinte mensagem:

 

Calma, não precisa desanimar. Existem formas de conseguir retornar valores após a execução de uma função, mas vou deixar para explicar isso mais para frente. Agora vamos à sintaxe de como criar e chamar as funções:

 

 

Declaração de funções

Abaixo estão algumas formas de declarar uma função em um script bash:

Forma 1

 

Forma 2

 

Forma 3

 

Todas as 3 formas tem o mesmo efeito. Não sei se existe alguma diferença ou incompatibilidade séria entre elas. Acredito que não, pois não vi nenhum alerta nas pesquisas que realizei, mas se descobrir, atualizo o post. 🙂

Para chamar as funções que você criou é simples, basta incluir o nome da função, da mesma forma que você faria com funções nativas do Linux.

Veja este exemplo:

No exemplo acima, declaramos a função “hello_world” e depois ela é chamada na última linha do script. O resultado vai ser a frase “Hello World!” vai ser escrita no terminal.

 

 

Passando argumentos para as funções

Uma parte importante da motivação para criar funções é que ela possa receber argumentos. Esta parte do procedimento é simples e é exatamente igual a passar argumentos para um script. Sendo assim, você pode utilizar a mesma lógica apresentada no post “Recuperando argumentos passados para um script shell” para recuperar os argumentos passados para a função.

A diferença é que, mesmo dentro da função, se você tentar utilizar a variável $0 ($ zero), ela vai possuir o nome do script e não da função.

Veja o exemplo:

No código acima, adaptei a função “hello_world” para que ela mostre no terminal todos os argumentos que foram passados para ela.

Na última linha do código, eu passo os argumentos: foo, bar, “bacon foo” e “bacon bar” para a função.

O resultado desta função ficaria assim:

Este exemplo mostra como os argumentos são processados.

 

 

Retornando valores

Ok, as funções em si não retornam valores, mas você consegue utilizar variáveis para transferir e verificar estes valores.

A forma mais simples é utilizar uma variável global para armazenar o valor.

 

Existe uma alternativa para as variáveis globais… o que é bom, pois algumas pessoas não gostam muito de utilizar estas variáveis. A alternativa é utilizar substituição:

 

Se não estiver satisfeito, também existe uma terceira opção, mas acho utiliza-la fica meio confuso na hora de ler o script. A terceira forma é escrever sua função de modo que ela aceite uma variável como argumento, que servirá para armazenar o resultado. Exemplo:

Da para perceber que fica um pouco mais confuso, mas funciona bem… apesar de depender da função eval.

Ela é uma função onde você constrói um comando através da concatenação de uma série de argumentos, mas isso é um assunto para um possível post futuro.

Bom, neste post mostrei como declarar e chamar um função, como passar e ler os argumentos para ela e como retornar o resultado. Divirta-se otimizando seus scripts bash! 🙂

 

Espero ter ajudado!

The following two tabs change content below.
Breno RdV
Ex-Psicólogo, com quase uma década de experiência em Recursos Humanos e Gestão de Pessoas, atual desenvolvedor e Analista de Sistemas, trabalhando com PowerBuilder, C#, PowerShell e expandindo horizontes para Python, Xamarin, PHP, Angular e (por que não?) Unity.

Comments

comments

Posted in Dev, Linux/Bash and tagged , , , , .