Pular para o conteúdo

Shell script que não quebra

Iniciante20 min de leiturafundamentos

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.

#!/usr/bin/env bash
set -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.

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.

Janela do terminal
shellcheck scripts/backup.sh
tmpdir="$(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.