Desenvolvimento em Bash
Padrões essenciais e melhores práticas para desenvolvimento de scripts em Bash 5.1+. Fornece expressões modernas de bash, tratamento de erros, análise de argumentos e alternativas em bash puro para comandos externos.
Fundação do Script
Todo script começa com o cabeçalho essencial:
#!/usr/bin/env bash
set -euo pipefail
Opções set explicadas:
-e- Sair imediatamente em caso de falha de comando-u- Tratar variáveis não definidas como erros-o pipefail- Pipeline falha se qualquer comando falhar
Padrão de Metadados do Script
SCRIPT_NAME=$(basename "${BASH_SOURCE[0]}")
SCRIPT_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
readonly SCRIPT_VERSION="1.0.0"
readonly SCRIPT_NAME SCRIPT_DIR
Tratamento de Erros
Implemente tratamento de erros baseado em trap para scripts robustos.
Análise de Argumentos
Template padrão para análise de argumentos.
Melhores Práticas para Variáveis
Sempre use chaves e quote variáveis:
# Correto
"${variable}"
"${array[@]}"
# Incorreto
$variable
${array[*]} # Use [@] para iteração adequada
Use readonly para constantes:
readonly CONFIG_FILE="/etc/app/config"
readonly -a VALID_OPTIONS=("opt1" "opt2" "opt3")
Nota: Nunca use readonly em scripts sourceados — causa erros ao re-sourcear.
Operações com Strings (Bash Puro)
Prefira expansão de parâmetros nativa do Bash em vez de ferramentas externas:
# Remover espaços em branco
trimmed="${string#"${string%%[![:space:]]*}"}"
trimmed="${trimmed%"${trimmed##*[![:space:]]}"}"
# Minúsculas/Maiúsculas (Bash 4+)
lower="${string,,}"
upper="${string^^}"
# Extração de substring
substring="${string:0:10}" # Primeiros 10 caracteres
suffix="${string: -5}" # Últimos 5 caracteres
# Substituir padrões
replaced="${string//old/new}" # Substituir todos
replaced="${string/old/new}" # Substituir primeiro
# Remover prefixo/sufixo
no_prefix="${string#prefix}" # Menor correspondência
no_prefix="${string##*/}" # Maior correspondência (basename)
no_suffix="${string%suffix}" # Menor correspondência
no_suffix="${string%%/*}" # Maior correspondência
Operações com Arrays
# Declaração
declare -a indexed_array=()
declare -A assoc_array=()
# Iteração segura com nullglob
shopt -s nullglob
for file in *.txt; do
process "${file}"
done
shopt -u nullglob
# Tamanho do array
length="${#array[@]}"
# Adicionar elemento
array+=("new_element")
# Iterar com índice
for i in "${!array[@]}"; do
printf '%d: %s\n' "${i}" "${array[i]}"
done
Operações com Arquivos
# Ler arquivo para string
content="$(<"${file}")"
# Ler arquivo para array (Bash 4+)
mapfile -t lines < "${file}"
# Verificar condições de arquivo
[[ -f "${file}" ]] # Arquivo regular existe
[[ -d "${dir}" ]] # Diretório existe
[[ -r "${file}" ]] # Legível
[[ -w "${file}" ]] # Gravável
[[ -x "${file}" ]] # Executável
[[ -s "${file}" ]] # Não vazio
# Criação segura de arquivo temporário
temp_file=$(mktemp)
trap 'rm -f "${temp_file}"' EXIT
Expressões Condicionais
Use [[ ]] para condicionais (específico do bash, mais poderoso):
# Comparações de string
[[ "${var}" == "value" ]] # Igualdade
[[ "${var}" == pattern* ]] # Correspondência glob
[[ "${var}" =~ ^regex$ ]] # Correspondência regex
# Comparações numéricas
(( num > 10 )) # Comparação aritmética
[[ "${num}" -gt 10 ]] # Sintaxe tradicional
# Condições compostas
[[ -f "${file}" && -r "${file}" ]]
[[ "${opt}" == "a" || "${opt}" == "b" ]]
Funções Utilitárias
Diretrizes de Desempenho
- Use builtins em vez de comandos externos quando possível
- Agrupe operações em vez de loops para grandes conjuntos de dados
- Use
printfem vez deechopara portabilidade e controle - Evite subshells desnecessárias em loops apertados
- Use
[[ ]]em vez de[ ]para comparações de strings
Recursos Adicionais
Arquivos de Referência
Para padrões e exemplos detalhados:
- bash_example_file.sh - Template de script completo
- bash_example_includes.bash - Funções utilitárias reutilizáveis
- bash-agent-notes.md - Orientação de revisão sensível ao contexto
- pure-bash-bible-strings.md - Padrões de manipulação de strings
- pure-bash-bible-arrays.md - Operações com arrays
- pure-bash-bible-files.md - Padrões de manipulação de arquivos
- pure-bash-bible-variables.md - Referência de expansão de parâmetros