Shell Script do Zero
Artigo 5 —
Módulo 1 · Fundamentos do Terminal e Linux Prof. Ricardo Matos — Dominando DevOps & Cloud em 1 Ano
Da Linha de Comando à Automação
Até aqui foram aprendidos comandos que se executam um de cada vez. Shell script é o passo seguinte: reunir esses comandos em um arquivo que pode ser executado sempre que necessário, passado para outros, versionado no Git e integrado a pipelines de CI/CD.
Em DevOps, scripts de shell estão em toda parte — em rotinas de backup, em scripts de inicialização de containers, em hooks de deploy, em verificações de saúde de serviços. Não é necessário dominar todas as nuances do Bash para ser produtivo. É necessário dominar o suficiente para escrever scripts claros, seguros e confiáveis.
Estrutura Básica de um Script
Todo script Bash começa com o shebang — a linha que informa ao sistema qual interpretador deve executar o arquivo:
#!/bin/bash
Um script completo e mínimo:
#!/bin/bash
echo "Iniciando verificação do sistema..."
date
whoami
echo "Verificação concluída."
Salva-se o arquivo como verificacao.sh, concede-se permissão de execução e executa-se:
chmod +x verificacao.sh
./verificacao.sh
O ./ antes do nome indica ao shell que o script está no diretório atual. Sem ele, o shell buscaria o comando nos diretórios do $PATH e não o encontraria.
Variáveis
#!/bin/bash
AMBIENTE="producao"
VERSAO="1.4.2"
DATA=$(date +%Y-%m-%d)
echo "Deploy da versão $VERSAO no ambiente $AMBIENTE"
echo "Data: $DATA"
Alguns pontos importantes sobre variáveis no Bash:
- Não se usa espaço em torno do
=na atribuição - Para usar o valor, coloca-se
$antes do nome - Para capturar a saída de um comando, usa-se
$(comando) - Por convenção, variáveis de ambiente e constantes são escritas em maiúsculas
Parâmetros de Entrada
Scripts podem receber argumentos ao serem executados:
#!/bin/bash
AMBIENTE=$1
VERSAO=$2
echo "Fazendo deploy da versão $VERSAO no ambiente $AMBIENTE"
Executando:
./deploy.sh producao 1.4.2
As variáveis especiais para parâmetros:
$1, $2, $3 # Primeiro, segundo, terceiro argumento
$@ # Todos os argumentos
$# # Quantidade de argumentos
$0 # Nome do próprio script
Condicionais
#!/bin/bash
AMBIENTE=$1
if [ "$AMBIENTE" == "producao" ]; then
echo "ATENÇÃO: deploy em produção. Confirmando..."
elif [ "$AMBIENTE" == "staging" ]; then
echo "Deploy em staging. Prosseguindo."
else
echo "Ambiente desconhecido: $AMBIENTE"
exit 1
fi
O exit 1 encerra o script com código de erro — fundamental em pipelines de CI/CD, que interpretam qualquer código diferente de zero como falha.
Comparações numéricas usam operadores diferentes:
if [ $NUMERO -eq 0 ]; then # igual
if [ $NUMERO -ne 0 ]; then # diferente
if [ $NUMERO -gt 10 ]; then # maior que
if [ $NUMERO -lt 10 ]; then # menor que
Laços
#!/bin/bash
# Iterando sobre uma lista
for SERVIDOR in web01 web02 web03; do
echo "Verificando $SERVIDOR..."
# aqui entraria um ssh para cada servidor
done
# Iterando sobre arquivos
for ARQUIVO in /var/log/*.log; do
echo "Processando: $ARQUIVO"
wc -l "$ARQUIVO"
done
# Loop com contador
for i in $(seq 1 5); do
echo "Tentativa $i..."
done
Funções
Funções organizam o script e evitam repetição:
#!/bin/bash
verificar_servico() {
local SERVICO=$1
if systemctl is-active --quiet "$SERVICO"; then
echo "✓ $SERVICO está rodando"
else
echo "✗ $SERVICO está parado"
fi
}
verificar_servico nginx
verificar_servico postgresql
verificar_servico redis
A palavra local restringe a variável ao escopo da função — boa prática para evitar conflitos com variáveis globais.
Tratamento de Erros
Um script profissional não silencia erros — ele os trata. Três configurações essenciais para scripts robustos:
#!/bin/bash
set -e # Interrompe o script se qualquer comando falhar
set -u # Trata variáveis não definidas como erro
set -o pipefail # Propaga erros em pipes
echo "Script iniciado"
comando_que_pode_falhar
echo "Esta linha só executa se o comando acima teve sucesso"
O set -e é especialmente importante em scripts de deploy — se um passo falha, o script para imediatamente em vez de continuar e causar danos maiores.
Um Script Real: Verificação de Saúde do Servidor
#!/bin/bash
set -euo pipefail
LOG="/var/log/health-check.log"
DATA=$(date "+%Y-%m-%d %H:%M:%S")
log() {
echo "[$DATA] $1" | tee -a "$LOG"
}
verificar_disco() {
USO=$(df / | awk 'NR==2 {print $5}' | tr -d '%')
if [ "$USO" -gt 85 ]; then
log "ALERTA: Disco em ${USO}% de uso"
else
log "OK: Disco em ${USO}% de uso"
fi
}
verificar_memoria() {
LIVRE=$(free -m | awk 'NR==2 {print $4}')
log "INFO: Memória livre: ${LIVRE}MB"
}
verificar_servicos() {
for SERVICO in nginx postgresql redis; do
if systemctl is-active --quiet "$SERVICO"; then
log "OK: $SERVICO rodando"
else
log "ERRO: $SERVICO parado"
fi
done
}
log "=== Início da verificação ==="
verificar_disco
verificar_memoria
verificar_servicos
log "=== Verificação concluída ==="
Este script pode ser executado manualmente ou agendado via cron para rodar a cada hora. Ele registra tudo em log e pode ser integrado a sistemas de alerta.
O Que Vem a Seguir
No próximo e último artigo do Módulo 1 será abordado o SSH — como conectar a servidores remotos de forma segura, como gerenciar chaves, como configurar acesso sem senha e como usar tunelamento. É o elo entre o ambiente local e os servidores reais onde tudo será implantado.
Referências para Aprofundamento
Documentação e leitura
- Bash Reference Manual — gnu.org — A documentação oficial e completa do Bash. Seções 3 e 4 cobrem sintaxe, variáveis e controle de fluxo.
- Shell Scripting Tutorial — shellscript.sh — Guia gratuito e objetivo, organizado por tópicos. Bom ponto de partida para quem quer ir além do básico.
- Advanced Bash-Scripting Guide — tldp.org — Referência extensa para quem quiser aprofundar. Cobre desde variáveis até expressões regulares e manipulação de strings.
Boas práticas
- ShellCheck — Ferramenta online que analisa scripts Bash e aponta erros, más práticas e problemas de portabilidade. Recomenda-se passar todo script por aqui antes de colocar em produção.
- Google Shell Style Guide — Guia de estilo do Google para scripts shell. Define convenções de nomenclatura, formatação e estrutura que tornam scripts mais legíveis e mantíveis.
Prática
- Exercism — Bash Track — Exercícios progressivos de Bash com feedback de mentores. Excelente para solidificar a sintaxe praticando problemas reais.
Artigo 5 de 52 · Módulo 1 — Fundamentos do Terminal e Linux Prof. Ricardo Matos · Série Dominando DevOps & Cloud em 1 Ano