HOWTO · Bash

Como usar as funções em Bash

O mesmo código que deve ser usado repetidamente é escrito como definição da função e a parte onde precisamos do código a ser usado, nós simplesmente chamamos a função.

Nesta página

Uma função é um dos aspectos mais importantes de toda linguagem de programação, e torna nosso código reutilizável e legível. O mesmo código usado repetidas vezes é escrito dentro de uma função. E quando precisamos do bloco de código, simplesmente chamamos a função definida.

Definir Funções em Bash

Para definir funções em Bash, podemos usar qualquer uma das duas abordagens a seguir:

Nesta abordagem, escrevemos o nome da função seguido de parênteses. Em seguida, definimos as funções dentro dos suportes de encaracolar. As funções usando este formato podem ser definidas usando qualquer um dos formatos:

function_name(){
statements
}
function_name() { statements }

Nesta abordagem, especificamos a palavra-chave function antes do nome da função.

function_name(){
statements
}
function_name() { statements }

As afirmações dentro das chaves encaracoladas determinam o que a função faz. O nome da função não tem nada a ver com o que a função faz, mas devemos tornar os nomes das funções descritivos. A definição da função não fará nada. Para executar os comandos na definição da função, devemos chamar a função.

Para chamar a função em Bash, utilizamos o nome da função.

#! /bin/bash

greet(){
    echo 'Hello, Folks. Welcome to DelftStack!'
}

greet

Resultado:

Hello, Folks. Welcome to DelftStack!

Aqui, definimos a função no início com o nome greet e depois chamamos a função. Quando chamamos a função, as afirmações dentro de uma definição de função são executadas e, portanto, vemos Hello, Folks. Welcome to DelftStack! impresso no terminal.

Também podemos definir a função utilizando outra abordagem como:

#! /bin/bash

function greet(){
    echo 'Hello, Folks. Welcome to DelftStack!'
}

greet

Resultado:

Hello, Folks. Welcome to DelftStack!

Devemos ter certeza de que sempre definimos a função antes de chamá-la.

Escopo das Variáveis em Bash

O escopo das variáveis pode ser global ou local em Bash, assim como de outras linguagens de programação. Entretanto, o escopo padrão das variáveis é sempre global, mesmo que seja declarado dentro do escopo da função. Devemos utilizar a palavra-chave local para tornar uma variável local.

#! /bin/bash

gvar1=1
gvar2=2

change_variables() {

    local gvar1=10
    gvar2=7
    
    echo "Inside Function: gvar1: $gvar1, gvar2: $gvar2"
}

echo "Before executing function: gvar1: $gvar1, gvar2: $gvar2"

change_variables

echo "After executing function: gvar1: $gvar1, gvar2: $gvar2"

Resultado:

Before executing function: gvar1: 1, gvar2: 2
Inside Function: gvar1: 10, gvar2: 7
After executing function: gvar1: 1, gvar2: 7

Aqui, gvar1 e gvar2 declaradas no topo são variáveis globais.

Dentro da função, gvar1 é declarada como uma variável local uma vez que utilizamos a palavra-chave local com gvar1 enquanto gvar2 ainda se refere a uma variável global uma vez que não tem uma palavra-chave local. Portanto, o valor de gvar2 é alterado globalmente pela função enquanto que o valor de gvar1 é alterado apenas dentro da função.

Retornar valores da função em Bash

Ao contrário de outras linguagens de programação, Bash não nos permite retornar valores da função. O valor retornado da função Bash é o status da última declaração executada na função. O número 0 representa o sucesso, enquanto o número de 1-255 representa o fracasso. Podemos especificar o status de saída da função utilizando a palavra-chave return. A declaração return também encerra a função.

#! /bin/bash

return_value(){
  echo "This function returns 20!"
  return 30
  echo "After return statement"
}

return_value
echo $?

Resultado:

This function returns 20!
30

Aqui, podemos ver que a função return_value retorna o valor 30 utilizando a instrução return, e o valor é atribuído à variável $?.

Também podemos observar que a função é encerrada após a instrução return ser executada, pois os comandos abaixo da instrução return não são executados.

Se quisermos retornar algum valor de uma função, podemos atribuir o valor a uma variável global e acessar a variável de fora da função para recuperar o valor.

#! /bin/bash

send_message(){
  message_from_function="Hello From the function!"
}
send_message
echo $message_from_function

Resultado:

Hello From the function!

No programa, atribuímos o valor a ser retornado à variável global message_from_function e então acessamos o valor retornado da variável.

Passar Argumentos para uma Função Bash

Para passar argumentos para uma função Bash, nós simplesmente colocamos os argumentos após a função. Se quisermos passar mais de um argumento para uma função, separamos os argumentos por um espaço. Para evitar o desajuste dos argumentos, podemos embrulhar os argumentos em aspas duplas.

Os parâmetros são acessados com $1 $2 e assim por diante, com base em sua posição. $0 representa o nome da função enquanto $# contém o número de argumentos posicionais na função.

#! /bin/bash

send_message(){
  message_from_function="Hello $1 "
}
send_message
echo $message_from_function "Delft!"

Resultado:

Hello Delft!

Aqui, o argumento Delft! é passado para a função e acessado na função pelo parâmetro $1, e obtemos Hello Delft! como a saída final da função.