[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".
- 🛡️ Envolva sempre as variáveis em
" ": O básico dos básicos para evitar avarias devido a espaços. - 🚨 Pare imediatamente em caso de erro com
set -e: Um interruptor de segurança para evitar acidentes inesperados. - 🔄 Utilize os resultados dos comandos com
$(comando): Uma arma poderosa para alcançar o processamento dinâmico. - 📖 Processe ficheiros linha a linha com
while read: O padrão para uma leitura de ficheiros segura e fiável. - 🗑️ Limpeza impecável com
mktempetrap: A forma profissional de lidar com ficheiros temporários de forma segura.
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!