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.
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
| Entrada (stdin) | Saída (stdout) |
|---|---|
| 123.456.789-09 | 12345678909 |
| 111.111.111-11 | (vazio - inválido) |
| 529.982.247-25 | 52998224725 |
| 98765432100 | 98765432100 |
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.