kb.erickguedes.com
Linux Avançado: Administração e Performance

Shell Scripting Avançado

Aula 1 de 7

Arrays e Manipulação de Strings

#!/bin/bash
# Arrays
FRUTAS=("maçã" "banana" "laranja")
echo "${FRUTAS[0]}"       # maçã
echo "${FRUTAS[@]}"       # todos
echo "${#FRUTAS[@]}"      # tamanho do array
echo "${!FRUTAS[@]}"      # índices

# Manipulação de strings
TEXTO="Linux é poderoso"
echo "${TEXTO/Linux/Unix}"    # substitui primeira ocorrência
echo "${TEXTO//o/0}"          # substitui todas
echo "${TEXTO:0:5}"           # substring (5 primeiros)
echo "${TEXTO##* }"           # remove prefixo mais longo (última palavra)

I/O Redirection Avançado

# Descritores de arquivo
comando > arquivo.log 2>&1          # stdout + stderr
comando &> arquivo.log              # igual (bash 4+)
comando 2> erro.log 1> saida.log    # separados

# Here Document
cat << EOF > config.txt
hostname=$(hostname)
data=$(date)
EOF

# Here String
grep "erro" <<< "$log_mensagem"

# Process Substitution
diff <(ls dir1) <(ls dir2)

Traps e Signals

#!/bin/bash
cleanup() {
    echo "Limpando recursos..."
    rm -f /tmp/arquivo_temporario
    exit
}

trap cleanup EXIT       # executa na saída
trap '' SIGINT          # ignora Ctrl+C
trap 'echo "Ctrl+C ignorado"' SIGINT
trap - SIGINT           # restaura comportamento padrão

# Exemplo prático
trap 'echo "ERRO na linha $LINENO"; exit 1' ERR

Expressões Regulares

#!/bin/bash
# grep com regex
grep -E "^[0-9]{3}-[0-9]{4}" arquivo.txt
grep -P "^\d{3}-\d{4}" arquivo.txt  # Perl regex (GNU grep)

# sed — stream editor
sed 's/erro/ERRO/g' arquivo.txt         # substituir
sed -i.bak 's/antigo/novo/g' arquivo    # in-place com backup
sed '/^#/d' config.txt                  # deletar linhas comentadas
sed -n '10,20p' arquivo.txt             # imprimir linhas 10-20

# awk — processamento de colunas
awk '{print $1, $3}' arquivo.txt        # colunas 1 e 3
awk '/erro/ {print NR, $0}' log.txt     # linhas com "erro" + número
awk -F: '{print $1}' /etc/passwd        # separador :

Parallelismo em Bash

#!/bin/bash
# Executar em paralelo usando &
processar() {
    sleep $1
    echo "Processo $1 concluído"
}

processar 5 &
processar 3 &
processar 1 &
wait    # aguarda todos
echo "Todos concluídos"

# GNU Parallel (se instalado)
parallel echo "Processando {}" ::: {1..10}

Shell scripting avançado transforma administração manual em automação confiável. Invista em sed, awk e traps.