My favorites | Sign in
Project Home Downloads Wiki Issues Source
Checkout   Browse   Changes    
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
# ----------------------------------------------------------------------------
# Gera um CPF válido aleatório ou valida um CPF informado.
# Obs.: O CPF informado pode estar formatado (pontos e hífen) ou não.
# Uso: zzcpf [cpf]
# Ex.: zzcpf 123.456.789-09 # valida o CPF
# zzcpf 12345678909 # com ou sem formatadores
# zzcpf # gera um CPF válido
#
# Autor: Thobias Salazar Trevisan, www.thobias.org
# Desde: 2004-12-23
# Licença: GPL
# ----------------------------------------------------------------------------
zzcpf ()
{
zzzz -h cpf "$1" && return

local i n somatoria digito1 digito2 cpf base

# Remove pontuação do CPF informado, deixando apenas números
cpf=$(echo "$*" | tr -d -c 0123456789)

# Extrai os números da base do CPF:
# Os 9 primeiros, sem os dois dígitos verificadores.
# Esses dois dígitos serão calculados adiante.
if [ "$cpf" ]
then
# Faltou ou sobrou algum número...
if [ ${#cpf} -ne 11 ]
then
echo 'CPF inválido (deve ter 11 dígitos)'
return 1
fi

# Apaga os dois últimos dígitos
base="${cpf%??}"
else
# Não foi informado nenhum CPF, vamos gerar um escolhendo
# nove dígitos aleatoriamente para formar a base
while [ ${#cpf} -lt 9 ]
do
cpf="$cpf$((RANDOM % 9))"
done
base="$cpf"
fi

# Truque para cada dígito da base ser guardado em $1, $2, $3, ...
set - $(echo "$base" | sed 's/./& /g')

# Explicação do algoritmo de geração/validação do CPF:
#
# Os primeiros 9 dígitos são livres, você pode digitar quaisquer
# números, não há seqüência. O que importa é que os dois últimos
# dígitos, chamados verificadores, estejam corretos.
#
# Estes dígitos são calculados em cima dos 9 primeiros, seguindo
# a seguinte fórmula:
#
# 1) Aplica a multiplicação de cada dígito na máscara de números
# que é de 10 a 2 para o primeiro dígito e de 11 a 3 para o segundo.
# 2) Depois tira o módulo de 11 do somatório dos resultados.
# 3) Diminui isso de 11 e se der 10 ou mais vira zero.
# 4) Pronto, achou o primeiro dígito verificador.
#
# Máscara : 10 9 8 7 6 5 4 3 2
# CPF : 2 2 5 4 3 7 1 0 1
# Multiplica: 20 + 18 + 40 + 28 + 18 + 35 + 4 + 0 + 2 = Somatória
#
# Para o segundo é praticamente igual, porém muda a máscara (11 - 3)
# e ao somatório é adicionado o dígito 1 multiplicado por 2.

### Cálculo do dígito verificador 1
# Passo 1
somatoria=0
for i in 10 9 8 7 6 5 4 3 2 # máscara
do
# Cada um dos dígitos da base ($n) é multiplicado pelo
# seu número correspondente da máscara ($i) e adicionado
# na somatória.
n="$1"
somatoria=$((somatoria + (i * n)))
shift
done
# Passo 2
digito1=$((11 - (somatoria % 11)))
# Passo 3
[ $digito1 -ge 10 ] && digito1=0

### Cálculo do dígito verificador 2
# Tudo igual ao anterior, primeiro setando $1, $2, $3, etc e
# depois fazendo os cálculos já explicados.
#
set - $(echo "$base" | sed 's/./& /g')
# Passo 1
somatoria=0
for i in 11 10 9 8 7 6 5 4 3
do
n="$1"
somatoria=$((somatoria + (i * n)))
shift
done
# Passo 1 e meio (o dobro do verificador 1 entra na somatória)
somatoria=$((somatoria + digito1 * 2))
# Passo 2
digito2=$((11 - (somatoria % 11)))
# Passo 3
[ $digito2 -ge 10 ] && digito2=0

# Mostra ou valida
if [ ${#cpf} -eq 9 ]
then
# Esse CPF foi gerado aleatoriamente pela função.
# Apenas adiciona os dígitos verificadores e mostra na tela.
echo "$cpf$digito1$digito2" |
sed 's/\(...\)\(...\)\(...\)/\1.\2.\3-/' # nnn.nnn.nnn-nn
else
# Esse CPF foi informado pelo usuário.
# Compara os verificadores informados com os calculados.
if [ "${cpf#?????????}" = "$digito1$digito2" ]
then
echo 'CPF válido'
else
# Boa ação do dia: mostrar quais os verificadores corretos
echo "CPF inválido (deveria terminar em $digito1$digito2)"
fi
fi
}

Change log

r710 by aureliojargas on Mar 29, 2012   Diff
SEGURANÇA: $1 colocado entre aspas na
chamada padrão zzzz -h de todas as
funções.
Go to: 
Sign in to write a code review

Older revisions

r705 by aureliojargas on Mar 29, 2012   Diff
SEGURANÇA: zzcpf, zzcnpj: colocadas
aspas ao redor das variáveis.
r665 by aureliojargas on Mar 28, 2012   Diff
SEGURANÇA: Protegendo $* com aspas,
para evitar uma possível expansão de
arquivos do shell. Funções: zzcpf,
zzcnpj.
r486 by aureliojargas on May 20, 2011   Diff
COMBO: Arrumadas inconsistências de
espaços em branco na indentação de
várias funções. Foi usado o script
'alinhamento' para encontrar os
problemas. Estas alterações não mudam
...
All revisions of this file

File info

Size: 3939 bytes, 126 lines
Powered by Google Project Hosting