財団法人 流通システム開発センターで公開されている JAN コードの仕様に基き、与えられた文字列が正しい JAN コードであるか否かを返すシェルスクリプト関数です。
JANコードの仕様
- 0 から 9 までの数字 8 桁または 13 桁から構成される。
- 桁数に関わらず、末尾の 1 桁はチェックデジット(誤り検出符号)として用いられる。
- チェックデジットを除く部分は、企業コードとアイテムコードから成る。
チェックデジットの算出方法
- 奇数桁にある数の和に 3 をかける。
- チェックデジットを除く偶数桁にある数の和を求める。
- 1 と 2 の和で求められた数の下 1 桁を n とする。
- n が 0 の時、チェックデジットは 0 である。
- n > 0 の時、チェックデジットは 10 – n である。
計算して求められたチェックデジットと、与えられた JAN コードのチェックデジットを比較し、一致すれば正しい JAN コードとして判断します。
検査スクリプト
計算処理を Bash 依存形式で記述している為、Bash でしか動作しません。
function isJAN(){
code="$_"
len=$( expr "$code" : "[0-9]$" )
if [ $len -eq 13 ]; then
ar=( $( echo "$code" | sed 's/(.)/\1 /g' ) )
n=$(( ( ${ar[1]} + ${ar[3]} + ${ar[5]} + ${ar[7]} + ${ar[9]} + ${ar[11]} ) * 3 ))
m=$(( ${ar[0]} + ${ar[2]} + ${ar[4]} + ${ar[6]} + ${ar[8]} + ${ar[10]} ))
a=$(( 10 - ( ( n + m ) % 10 ) ))
if [ $a -eq 10 ]; then a=0; fi
if [ ${ar[12]} -eq $a ]; then
return 0
else
echo isJAN: Check digit error ${ar[12]} is not $a 1>&2
return 1
fi
elif [ $len -eq 8 ]; then
ar=( $( echo "$code" | sed 's/(.)/\1 /g' ) )
n=$(( ( ${ar[0]} + ${ar[2]} + ${ar[4]} + ${ar[6]} ) * 3 ))
m=$(( ${ar[1]} + ${ar[3]} + ${ar[5]} ))
a=$(( 10 - ( n + m ) % 10 ))
if [ $a -eq 10 ]; then a=0; fi
if [ ${ar[7]} -eq $a ]; then
return 0
else
echo isJAN: Check digit error 1>&2
return 1
fi
else
echo isJAN: Number of digits error 1>&2
return 2
fi
}
これは、次のようにスクリプト内で使用します。
#!/usr/bin/env bash
function isJAN(){
(省略)
}
isJAN 4569951116179
if [ $? -eq 0 ]; then
echo YES!
else
echo NO!
fi
また、シェルで関数定義を行なった後、
export isJAN
しておけば、isJAN をコマンドとしても利用することができます。
※ 2020/07/02 度重なるブログ移転・ブログシステムのアップデートにより崩れた記事を校正。