🇯🇵 日本語 | 🇺🇸 English | 🇪🇸 Español | 🇵🇹 Português | 🇹🇭 ไทย | 🇨🇳 中文

[Guia Definitivo] 5 Padrões de Bash a Aprender e Como Evitar Erros

Na nossa série de introdução ao Bash até agora, adquiriu as competências fundamentais para dominar o ecrã preto, desde comandos básicos até à criação de scripts simples. Provavelmente já começou a sentir como as suas tarefas diárias se tornaram um pouco mais fáceis ao combinar comandos. Ótimo trabalho!

Agora, para concluir a nossa série sobre o Bash, desta vez vamos dar um passo em frente para evoluir de um script que "apenas funciona" para um que é "seguro, legível e menos propenso a erros" — um script profissional. Vamos ensinar 5 padrões particularmente importantes e como evitar as "armadilhas" em que os iniciantes costumam cair.

O que vamos apresentar não são comandos novos e difíceis. Trata-se de "como usar corretamente" o conhecimento que já aprendeu — dicas de condução, por assim dizer. Tal como um novo condutor aprende técnicas para conduzir em segurança em dias de chuva ou em estradas escuras, com o artigo de hoje, também você irá dominar como escrever scripts que pode executar com confiança em qualquer situação!


Padrão 1: Envolva sempre as variáveis em "aspas duplas"!

Esta é a regra de ouro absoluta na escrita de scripts Bash. Negligenciar o envolvimento de variáveis em aspas duplas " " é a maior causa de erros inesperados. O problema torna-se especialmente evidente quando uma variável contém espaços.

Erro comum: variáveis sem aspas

Por exemplo, vejamos o seguinte script que tenta criar um diretório com um espaço no nome.

#!/bin/bash
DIR_NAME="My Project"
mkdir $DIR_NAME

Quando executa este script, o Bash interpreta-o como o comando mkdir My Project, o que resulta na criação de dois diretórios separados, chamados "My" e "Project". Este não é o resultado pretendido.


Melhor prática: envolver as variáveis em " "

Para resolver este problema, basta envolver a variável em aspas duplas. Isto faz com que o Bash reconheça corretamente toda a cadeia de caracteres, incluindo o espaço, como uma "única unidade".

#!/bin/bash
DIR_NAME="My Project"
mkdir "$DIR_NAME" # Envolva a variável em aspas duplas!
echo "Diretório '$DIR_NAME' criado."

Este simples hábito tornará os seus scripts muito mais robustos. Grave isto na sua mente: "Envolva sempre as suas variáveis em aspas duplas."


Padrão 2: Design à prova de falhas que para imediatamente em caso de erro

O assustador dos scripts Bash é que eles continuarão a executar os comandos seguintes sem pensar duas vezes, mesmo que um comando a meio falhe. Por exemplo, o que aconteceria num script que deve "mover-se para um diretório e depois apagar um ficheiro lá dentro" se o comando de movimento falhar? Poderia acabar num desastre em que um ficheiro é apagado numa localização não intencional.

Para evitar isto, escreva o seguinte feitiço mágico no início do seu script.

set -e

set -e é um "interruptor de segurança" que interrompe imediatamente a execução do script se algum comando executado dentro dele falhar. Vejamos o seu efeito no seguinte script.


#!/bin/bash
set -e # Ligue o interruptor de segurança

echo "A iniciar o processo..."

# Tenta mover-se para um diretório inexistente, o que causará um erro aqui
cd /non-existent-directory

# Devido ao set -e, esta linha nunca será executada
echo "Esta mensagem não será exibida."

Quando executa este script, o processo irá parar no momento em que o comando cd falhar, e o último echo não será executado. Crie o hábito de incluir esta linha em qualquer script que realize operações importantes.


Padrão 3: Colocar o resultado de um comando numa variável

Quando está a escrever scripts, encontrará frequentemente situações em que quer "usar o 'resultado' de um comando noutro comando ou variável". Por exemplo, pode querer incluir a data de hoje num nome de ficheiro de cópia de segurança.

Para isto, usamos uma funcionalidade chamada Substituição de Comando (Command Substitution). A sintaxe é $(comando).

#!/bin/bash
set -e

# Obter a data de hoje no formato AAAA-MM-DD e guardá-la numa variável
TODAY=$(date "+%Y-%m-%d")

# Incorporar a data no nome do ficheiro
BACKUP_FILENAME="backup_${TODAY}.tar.gz"

echo "Nome do ficheiro de backup: $BACKUP_FILENAME"
# tar -czf "$BACKUP_FILENAME" /caminho/para/a/origem/do/backup

A parte $(date "+%Y-%m-%d") é substituída pelo resultado da execução do comando date (ex: 2025-07-06). Isto permite-lhe gerar facilmente nomes de ficheiro dinâmicos e descritivos.


Padrão 4: Processar ficheiros de forma segura, linha a linha

Ler um ficheiro de texto (uma lista de domínios, uma lista de URLs, etc.) e realizar alguma ação para cada linha é um caso de uso típico para um script. No entanto, este processo tem uma "armadilha" em que os iniciantes costumam cair.

Padrão incorreto comum

Uma sintaxe como for line in $(cat file.txt) deve ser evitada porque não consegue lidar corretamente com casos em que um ficheiro contém espaços.

A melhor prática segura: o loop `while read`

O padrão padrão para processar um ficheiro de forma segura e eficiente, linha a linha, é o loop while read. Pode parecer um pouco complicado, mas a melhor abordagem é memorizá-lo nesta forma.

Primeiro, vamos preparar um ficheiro de lista para processar, domains.txt.

example.com
example.net
example.org

De seguida, aqui está o script que lê este ficheiro e o processa.

#!/bin/bash
set -e

INPUT_FILE="domains.txt"

while IFS= read -r line
do
  echo "A processar o domínio: $line"
  # Aqui realizaria ações como ping "$line" ou curl "http://$line/"
done < "$INPUT_FILE"

Esta sintaxe pode ser aplicada ao processamento de qualquer ficheiro de texto porque preserva os espaços iniciais e finais numa linha e lida corretamente com caracteres especiais.


Padrão 5: Criar e apagar ficheiros temporários de forma segura

No meio da execução de um script, pode precisar de um ficheiro temporário para trabalhar. Neste caso, codificar um nome de ficheiro como /tmp/my_temp_file é perigoso. Se outro programa estiver a usar um ficheiro com o mesmo nome, ou se várias instâncias do script forem executadas ao mesmo tempo, o ficheiro pode ser sobrescrito.

Para criar um ficheiro temporário de forma segura, use o comando mktemp. Isto cria um ficheiro vazio com um nome único que não entrará em conflito com mais nada.

#!/bin/bash
set -e

# Cria um ficheiro temporário seguro e guarda o seu nome numa variável
TEMP_FILE=$(mktemp)

# Remove sempre o ficheiro temporário quando o script termina (com sucesso, erro ou interrupção)
trap 'rm -f "$TEMP_FILE"' EXIT

echo "Ficheiro temporário criado: $TEMP_FILE"
echo "A escrever dados para este ficheiro..."
echo "some temporary data" > "$TEMP_FILE"

echo "Conteúdo do ficheiro:"
cat "$TEMP_FILE"

echo "Processo concluído. O ficheiro temporário será apagado automaticamente."

Além disso, ao combiná-lo com o comando trap, pode reservar uma ação de limpeza para "apagar sempre este ficheiro temporário no final, não importa por que razão o script termine". Isto evita que ficheiros de lixo desnecessários fiquem no servidor.


Conclusão

Ótimo trabalho! Com isto, concluímos a nossa série de introdução ao Bash. Nesta última parte, aprendeu 5 padrões importantes para elevar os seus scripts de "brinquedos" a "ferramentas profissionais".

Apenas por estar ciente destes padrões, os scripts que escreve tornar-se-ão significativamente mais fiáveis e fáceis de manter, tornando-os fáceis de ler para o seu eu futuro ou para outras pessoas. Por favor, use-os na criação dos seus futuros scripts. Esperamos sinceramente que a sua vida no desenvolvimento web, agora armada com a poderosa ferramenta do Bash, se torne ainda mais criativa e eficiente!