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
# ----------------------------------------------------------------------------
# Gera um CNPJ válido aleatório ou valida um CNPJ informado.
# Obs.: O CNPJ informado pode estar formatado (pontos e hífen) ou não.
# Uso: zzcnpj [cnpj]
# Ex.: zzcnpj 12.345.678/0001-95 # valida o CNPJ
# zzcnpj 12345678000195 # com ou sem formatadores
# zzcnpj # gera um CNPJ válido
#
# Autor: Aurelio Marinho Jargas, www.aurelio.net
# Desde: 2004-12-23
# Licença: GPL
# ----------------------------------------------------------------------------
zzcnpj ()
{
zzzz -h cnpj "$1" && return

local i n somatoria digito1 digito2 cnpj base

# Atenção:
# Essa função é irmã-quase-gêmea da zzcpf, que está bem
# documentada, então não vou repetir aqui os comentários.
#
# O cálculo dos dígitos verificadores também é idêntico,
# apenas com uma máscara numérica maior, devido à quantidade
# maior de dígitos do CNPJ em relação ao CPF.

cnpj=$(echo "$*" | tr -d -c 0123456789)

if [ "$cnpj" ]
then
# CNPJ do usuário

if [ ${#cnpj} -ne 14 ]
then
echo 'CNPJ inválido (deve ter 14 dígitos)'
return 1
fi

base="${cnpj%??}"
else
# CNPJ gerado aleatoriamente

while [ ${#cnpj} -lt 8 ]
do
cnpj="$cnpj$((RANDOM % 9))"
done

cnpj="${cnpj}0001"
base="$cnpj"
fi

# Cálculo do dígito verificador 1

set - $(echo "$base" | sed 's/./& /g')

somatoria=0
for i in 5 4 3 2 9 8 7 6 5 4 3 2
do
n="$1"
somatoria=$((somatoria + (i * n)))
shift
done

digito1=$((11 - (somatoria % 11)))
[ $digito1 -ge 10 ] && digito1=0

# Cálculo do dígito verificador 2

set - $(echo "$base" | sed 's/./& /g')

somatoria=0
for i in 6 5 4 3 2 9 8 7 6 5 4 3 2
do
n="$1"
somatoria=$((somatoria + (i * n)))
shift
done
somatoria=$((somatoria + digito1 * 2))

digito2=$((11 - (somatoria % 11)))
[ $digito2 -ge 10 ] && digito2=0

# Mostra ou valida o CNPJ
if [ ${#cnpj} -eq 12 ]
then
echo "$cnpj$digito1$digito2" |
sed 's|\(..\)\(...\)\(...\)\(....\)|\1.\2.\3/\4-|'
else
if [ "${cnpj#????????????}" = "$digito1$digito2" ]
then
echo 'CNPJ válido'
else
# Boa ação do dia: mostrar quais os verificadores corretos
echo "CNPJ 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.
r655 by aureliojargas on Mar 23, 2012   Diff
s/Aurélio/Aurelio/ *
All revisions of this file

File info

Size: 2291 bytes, 97 lines
Powered by Google Project Hosting