Funções Shell

ShellBeginner
Pratique Agora

Introdução

Neste laboratório, vamos explorar as funções shell no Linux. Funções shell são blocos de código reutilizáveis que executam tarefas específicas, tornando nossos scripts mais organizados e eficientes. Aprenderemos como criar, chamar e utilizar funções com parâmetros em scripts shell. Este laboratório foi projetado para iniciantes, por isso avançaremos passo a passo e explicaremos cada conceito detalhadamente.

Criando Sua Primeira Função Shell

Vamos começar criando uma função shell simples. Funções shell funcionam como mini-scripts dentro de um script maior, permitindo agrupar comandos que realizam uma tarefa específica.

Primeiro, precisamos criar um novo arquivo. Abra seu terminal e digite:

cd ~/project
touch functions.sh

Este comando acessa o diretório project e cria um novo arquivo chamado functions.sh. Este arquivo conterá nossas funções shell.

Agora, vamos adicionar nossa primeira função:

#!/bin/bash

## This is a simple function
greet() {
  echo "Hello, World!"
}

## This line calls (runs) the function
greet

Vamos analisar o código:

  • A primeira linha #!/bin/bash é chamada de shebang. Ela instrui o sistema a usar o bash para interpretar este script.
  • Definimos nossa função com greet() { }. Tudo o que estiver entre as chaves faz parte da função.
  • Dentro da função, temos um comando echo simples que imprime "Hello, World!".
  • A última linha greet chama (executa) nossa função.

Agora, vamos tornar nosso script executável e rodá-lo:

chmod +x functions.sh
./functions.sh

Você deverá ver:

Hello, World!

Se você não vir essa saída, verifique se digitou tudo corretamente no arquivo functions.sh.

Funções com Parâmetros

Agora que criamos uma função básica, vamos torná-la mais flexível adicionando parâmetros. Os parâmetros nos permitem passar informações para dentro de nossas funções.

Abra o arquivo functions.sh novamente e substitua o conteúdo pelo seguinte código:

#!/bin/bash

## Function with a parameter
greet() {
  echo "Hello, $1!"
}

## Function with multiple parameters
calculate() {
  echo "The sum of $1 and $2 is $(($1 + $2))"
}

## Call functions with arguments
greet "Alice"
calculate 5 3

Vamos examinar este código:

  • Na função greet, $1 refere-se ao primeiro argumento passado para a função.
  • Na função calculate, $1 e $2 referem-se ao primeiro e segundo argumentos, respectivamente.
  • $(($1 + $2)) realiza a adição aritmética dos dois parâmetros.

Execute o script:

./functions.sh

Você deverá ver:

Hello, Alice!
The sum of 5 and 3 is 8

Se não visualizar essa saída, certifique-se de ter salvo as alterações no arquivo corretamente.

Valores de Retorno de Funções

No shell scripting, as funções não retornam valores da mesma forma que em outras linguagens de programação. Em vez disso, elas podem exibir um resultado via echo (que pode ser capturado) ou modificar uma variável global. Vamos explorar ambos os métodos.

Abra o functions.sh novamente e atualize o conteúdo com o seguinte código:

#!/bin/bash

## Function that echoes a result
get_square() {
  echo $(($1 * $1))
}

## Function that modifies a global variable
RESULT=0
set_global_result() {
  RESULT=$(($1 * $1))
}

## Capture the echoed result
square_of_5=$(get_square 5)
echo "The square of 5 is $square_of_5"

## Use the function to modify the global variable
set_global_result 6
echo "The square of 6 is $RESULT"

Vamos detalhar o que acontece:

  • A função get_square usa o echo para enviar o resultado para a saída, que capturamos usando a sintaxe $().
  • A função set_global_result modifica diretamente a variável global RESULT.
  • Usamos $() para capturar a saída de get_square em uma variável.
  • Chamamos set_global_result, que altera RESULT, e então imprimimos o valor de RESULT.

Salve o arquivo e execute-o:

./functions.sh

Você deverá ver:

The square of 5 is 25
The square of 6 is 36

Se não vir este resultado, verifique se há erros de digitação no seu arquivo functions.sh.

Entendendo o Escopo de Variáveis

Em scripts shell, as variáveis são globais por padrão. Isso significa que podem ser acessadas de qualquer lugar do script. No entanto, você pode usar a palavra-chave local para criar variáveis que sejam acessíveis apenas dentro de uma função. Isso é chamado de escopo local.

Vamos modificar nosso arquivo functions.sh para demonstrar este conceito.

Atualize o conteúdo com o código abaixo:

#!/bin/bash

## Global variable
GLOBAL_VAR="I'm global"

## Function with a local variable
demonstrate_scope() {
  local LOCAL_VAR="I'm local"
  echo "Inside function: GLOBAL_VAR = $GLOBAL_VAR"
  echo "Inside function: LOCAL_VAR = $LOCAL_VAR"
}

## Call the function
demonstrate_scope

echo "Outside function: GLOBAL_VAR = $GLOBAL_VAR"
echo "Outside function: LOCAL_VAR = $LOCAL_VAR"

Eis o que está acontecendo neste script:

  • Definimos uma variável global GLOBAL_VAR.
  • Dentro da função demonstrate_scope, definimos uma variável local LOCAL_VAR usando a palavra-chave local.
  • Imprimimos ambas as variáveis dentro da função.
  • Após chamar a função, tentamos imprimir ambas as variáveis novamente fora dela.

Salve o arquivo e execute-o:

./functions.sh

Você deverá ver uma saída semelhante a esta:

Inside function: GLOBAL_VAR = I'm global
Inside function: LOCAL_VAR = I'm local
Outside function: GLOBAL_VAR = I'm global
Outside function: LOCAL_VAR =

Observe que LOCAL_VAR está vazia quando acessada fora da função. Isso ocorre porque variáveis locais só existem dentro da função onde foram definidas.

Função Avançada - ENGLISH_CALC

Agora que cobrimos o básico das funções shell, vamos criar uma função mais avançada chamada ENGLISH_CALC. Esta função receberá três argumentos: dois números e uma operação (plus, minus ou times).

Substitua o conteúdo pelo seguinte código:

#!/bin/bash

ENGLISH_CALC() {
  local num1=$1
  local operation=$2
  local num2=$3
  local result

  case $operation in
    plus)
      result=$((num1 + num2))
      echo "$num1 + $num2 = $result"
      ;;
    minus)
      result=$((num1 - num2))
      echo "$num1 - $num2 = $result"
      ;;
    times)
      result=$((num1 * num2))
      echo "$num1 * $num2 = $result"
      ;;
    *)
      echo "Invalid operation. Please use 'plus', 'minus', or 'times'."
      return 1
      ;;
  esac
}

## Test the function
ENGLISH_CALC 3 plus 5
ENGLISH_CALC 5 minus 1
ENGLISH_CALC 4 times 6
ENGLISH_CALC 2 divide 2 ## This should show an error message

Vamos analisar esta função:

  • Usamos variáveis local para armazenar nossas entradas e resultados. Esta é uma boa prática para evitar interferência com variáveis globais.
  • Usamos uma instrução case para lidar com diferentes operações. Isso é semelhante ao comando switch em outras linguagens.
  • Para cada operação válida, realizamos o cálculo e exibimos o resultado.
  • Se uma operação inválida for fornecida, exibimos uma mensagem de erro e retornamos 1 (em scripts shell, um valor de retorno diferente de zero indica um erro).
  • Ao final, testamos nossa função com várias entradas, incluindo uma operação inválida.

Salve o arquivo e execute-o:

./functions.sh

Você deverá ver a seguinte saída:

3 + 5 = 8
5 - 1 = 4
4 * 6 = 24
Invalid operation. Please use 'plus', 'minus', or 'times'.

Se não visualizar este resultado, verifique se há erros de digitação no seu arquivo functions.sh.

Resumo

Neste laboratório, exploramos as funções shell no Linux, partindo do básico e progredindo para conceitos mais avançados. Aprendemos como:

  1. Criar e chamar funções simples.
  2. Trabalhar com parâmetros de função.
  3. Retornar valores de funções usando echo e variáveis globais.
  4. Entender o escopo de variáveis e usar variáveis locais.
  5. Criar uma função mais complexa que processa operações aritméticas.

As funções shell são ferramentas poderosas que ajudam a escrever códigos mais organizados, eficientes e reutilizáveis. Elas permitem dividir scripts complexos em partes menores e gerenciáveis, facilitando a compreensão e a manutenção.

Ao dominar as funções shell, você será capaz de escrever scripts mais sofisticados e automatizar tarefas complexas de forma mais eficaz em um ambiente Linux. Lembre-se, a prática é fundamental para se tornar proficiente em shell scripting. Tente modificar as funções que criamos ou crie as suas próprias para resolver problemas específicos que encontrar no seu dia a dia com Linux.