flysmog.pages.dev

Como criar um script bash para processar CPFs de stdin?

Processar CPFs diretamente da entrada padrão (stdin) em um script bash é uma tarefa comum para automação de validação e formatação de dados. Este método é eficaz porque permite o processamento em pipeline, integrando-se facilmente com outros comandos Unix e scripts, garantindo rapidez e precisão.

Pré-requisitos

Criando o script de processamento de CPFs

O script abaixo lê CPFs da entrada padrão, valida o formato e os dígitos verificadores, e imprime apenas os CPFs válidos. Ele suporta CPFs com ou sem formatação (pontos e traço).

#!/bin/bash

# Função para validar CPF
validate_cpf() {
    local cpf=$1
    # Remove caracteres não numéricos
    cpf=$(echo "$cpf" | tr -d '[:punct:]' | tr -d '[:space:]')
    # Verifica se tem 11 dígitos
    if [[ ${#cpf} -ne 11 || "$cpf" =~ ^([0-9])\1{10}$ ]]; then
        return 1
    fi
    # Calcula primeiro dígito verificador
    local sum=0
    for i in {10..2}; do
        sum=$((sum + ${cpf:10-$i:1} * i))
    done
    local digit1=$((sum * 10 % 11))
    digit1=$((digit1 == 10 ? 0 : digit1))
    # Calcula segundo dígito verificador
    sum=0
    for i in {11..2}; do
        sum=$((sum + ${cpf:11-$i:1} * i))
    done
    local digit2=$((sum * 10 % 11))
    digit2=$((digit2 == 10 ? 0 : digit2))
    # Compara dígitos verificadores
    if [[ ${cpf:9:1} -eq $digit1 && ${cpf:10:1} -eq $digit2 ]]; then
        echo "$cpf"
        return 0
    else
        return 1
    fi
}

# Processa stdin linha por linha
while IFS= read -r line; do
    validate_cpf "$line"
done

Exemplo Prático

Entrada (stdin) Saída (stdout)
123.456.789-09 12345678909
111.111.111-11 (vazio - inválido)
529.982.247-25 52998224725
98765432100 98765432100

Como usar o script

Salve o código em um arquivo (ex: processa_cpfs.sh), dê permissão de execução com chmod +x processa_cpfs.sh, e use-o em pipeline:

echo -e "123.456.789-09\n529.982.247-25" | ./processa_cpfs.sh

Com este método, você automatiza a validação e formatação de CPFs em segundos, evitando erros manuais e garantindo que apenas dados corretos sejam processados adiante.