12 апр. 2010 г.

Контрольная цифра EAN-13

Потребовалось "восстановить" незаписанную вовремя контрольную (13-ую, последнюю) цифру штрихкода EAN-13. Собственно, результат:
#!/bin/bash
#Проверка наличия кода
if [ -z "$1" ]; then
echo "Введите сканкод в качестве аргумента"
exit 0
fi
CODE12=$1
#Определение длины кода
LEN1=`echo $CODE12 | wc -m`
#отбрасывание символа перевода строки
let LEN2=$LEN1-2
#echo $LEN1
#echo $LEN2
#Разбиение строки кода на отдельные цифры
for D in `seq 0 $LEN2`
do
let NUM=$D
let DIG$NUM=${CODE12:$D:1}
# echo DIG$NUM=$DIG$NUM
# echo $D
done
#Если по длине предполагается неполный EAN13, произвести расчет контрольной цифры
if [ $LEN2 == 11 ];then
#chet
VAR1=`expr $DIG1 + $DIG3 + $DIG5 + $DIG7 + $DIG9 + $DIG11`
#nechet
VAR2=`expr $DIG0 + $DIG2 + $DIG4 + $DIG6 + $DIG8 + $DIG10`
VAR3=`expr $VAR1 \* 3`
VAR4=`expr $VAR2 + $VAR3`
#Выбираем только последнюю цифру переменной $VAR4, если ее длина больше 1
LENVAR4=`expr length $VAR4`
if [ "$LENVAR4" -gt "1" ]; then
VAR4OFFSET=`expr $LENVAR4 \- 1`
let VAR4LAST=${VAR4:$VAR4OFFSET:1}
# echo $VAR4LAST
else
#Если длина $VAR4 единична, сразу определяем $VAR4LAST
VAR4LAST=$VAR4
fi
CTRL=`expr 10 \- $VAR4LAST`
if [ $CTRL == 10 ]; then
CTRL=0
fi
#Вывести контрольную цифру
  echo "Контрольная цифра для штрихкода $CODE12 - $CTRL"
fi