Automatizar tarefas repetitivas economiza tempo e reduz erros manuais. Nesta aula, vamos criar shell scripts simples para tarefas diárias, adotar boas práticas de estruturação e implementar tratamento de erros para tornar seus scripts mais confiáveis.
2. Estrutura Básica de um Script
- Shebang e permissões
#!/usr/bin/env bash
Coloque sempre na primeira linha para indicar o interpretador.
Dê permissão de execução:
chmod +x meu_script.sh
Comentários e ajuda interna
# meu_script.sh — Faz backup de um diretório
# Uso: ./meu_script.sh /origem /destino
Explique a finalidade, parâmetros e exemplos de uso.
Recebendo parâmetros
SRC="$1"
DST="$2"
if [[ -z "$SRC" || -z "$DST" ]]; then
echo "Uso: $0 <origem> <destino>"
exit 1
fi
3. Técnicas Simples de Automação
3.1. Backup Diário com rsync
#!/usr/bin/env bash
SRC="$1"; DST="$2"
rsync -av --delete "$SRC" "$DST"
-a
: modo arquivamento.
-v
: verbose.
--delete
: remove arquivos inexistentes na origem.
Agende no cron:
0 2 * * * /path/to/meu_script.sh /home/user/ /backup/user/
3.2. Limpeza de Arquivos Antigos
#!/usr/bin/env bash
TARGET_DIR="$1"; DAYS="$2"
find "$TARGET_DIR" -type f -mtime +"$DAYS" -print -delete
Remove arquivos modificados há mais de N dias.
3.3. Relatórios Simples
#!/usr/bin/env bash
LOG="/var/log/syslog"
echo "Erros nas últimas 24h:" > erros.txt
grep -i "error" "$LOG" | tail -n 100 >> erros.txt
4. Boas Práticas de Estrutura
- Funções para modularizar
backup() {
rsync -av --delete "$1" "$2"
}
cleanup() {
find "$1" -type f -mtime +"$2" -delete
}
main() {
backup "$SRC" "$DST"
cleanup "$DST" 7
}
# Execução
main
Variáveis e constantes
- Declare valores fixos no início:
readonly LOG_DIR="/var/log/minhas_tarefas"
Checagem de pré-requisitos
command -v rsync >/dev/null || { echo "rsync não encontrado"; exit 1; }
Logging interno
log() {
echo "[$(date '+%F %T')] $1" >> "$LOG_DIR/script.log"
}
5. Tratamento de Erros
- Exit codes
- Comandos bem-sucedidos retornam
0
, falhas retornam >0. - Capture e valide:
- Comandos bem-sucedidos retornam
rsync -av "$SRC" "$DST"
if [[ $? -ne 0 ]]; then
echo "Backup falhou"; exit 2
fi
set -euo pipefail
- Coloque no topo do script:
set -e # sai se qualquer comando falhar
set -u # erro ao usar variável não definida
set -o pipefail # falha se qualquer etapa de um pipe falhar
Mensagens de erro claras
error() {
echo "Erro: $1" >&2
}
[[ -d "$SRC" ]] || error "Origem não é um diretório" && exit 1
6. Exercícios Práticos
- Script de compactação: crie um script que receba um diretório e compacte em
.tar.gz
com data no nome. - Monitoração de serviço: escreva um script que verifique se o serviço
nginx
está rodando e reinicie se não estiver. - Funções reutilizáveis: transforme seu script de backup em funções e importe de um arquivo
lib.sh
. - Simule erros: force um erro (remova um comando essencial) e observe como
set -euo pipefail
se comporta.
7. Dica de Ouro
Modo Verbose Condicional
Permita rodar em modo verbose opcional:
VERBOSE=false
[[ "$1" == "-v" ]] && VERBOSE=true && shift
log() {
$VERBOSE && echo "LOG: $1"
}
Use ./script.sh -v
para debugar com mensagens extras e ./script.sh
para execução silenciosa.