Shell script que não quebra
Um script de operação precisa falhar cedo, explicar o que fez e poder ser repetido com segurança. Bash é ótimo para orquestrar comandos pequenos; não é uma boa escolha para lógica complexa, concorrência ou dados estruturados extensos.
Comece defensivo
Seção intitulada “Comece defensivo”#!/usr/bin/env bashset -euo pipefail
arquivo="${1:?uso: $0 ARQUIVO}"tmp="$(mktemp)"trap 'rm -f "$tmp"' EXIT
[[ -r "$arquivo" ]] || { echo "não consigo ler: $arquivo" >&2; exit 1; }grep -F -- 'ativo=true' "$arquivo" >"$tmp"-e interrompe em muitos erros, -u acusa variável não definida e pipefail faz um
pipeline falhar se qualquer comando falhar. Eles não substituem testes explícitos:
condicionais, subshells e comandos onde uma saída vazia é aceitável exigem tratar o código
de saída conscientemente. Sempre coloque variáveis entre aspas; sem elas, espaços e
caracteres especiais viram múltiplos argumentos. Use -- antes de valores que podem
começar com hífen.
Argumentos, limpeza e idempotência
Seção intitulada “Argumentos, limpeza e idempotência”Uma ferramenta deve validar entradas antes de alterar estado e imprimir uma mensagem de
uso em caso de erro. mktemp evita colisão de arquivos temporários; trap ... EXIT
limpa tanto no sucesso quanto na maior parte das falhas. Não registre segredos: desligue
set -x perto de credenciais e passe tokens por arquivo protegido, stdin ou mecanismo de
segredos.
Idempotência é poder rodar de novo sem efeito inesperado. Prefira consultas e operações
declarativas: antes de criar usuário, verifique se existe; antes de aplicar migração,
registre sua versão. Não use || true para silenciar erro sem documentar qual falha é
aceitável, pois isso transforma incidente em sucesso falso.
Teste o contrato
Seção intitulada “Teste o contrato”shellcheck scripts/backup.shtmpdir="$(mktemp -d)"; trap 'rm -rf "$tmpdir"' EXIT./scripts/backup.sh "$tmpdir/config" && test -f "$tmpdir/resultado"Separe funções puras de comandos que escrevem no sistema; isso permite testar entradas e saídas. Em CI, execute o script em diretório temporário e teste também entrada inválida. Quando precisar de parsing JSON, retries elaborados, biblioteca HTTP ou testes grandes, use Python, Go ou outra linguagem adequada e mantenha Bash apenas como interface.
Próximo passo: coloque esse contrato em uma automação reproduzível na trilha de Automação e entregue-a por CI/CD.