#!/bin/bash while [[ $1 ]] do [[ ${#1} -eq 13 ]] || [[ ${#1} -eq 12 ]] || { printf >&2 'length is %d, should be 13\n' ${#1} exit 1 } declare -i checksum=0 declare -i factor=1 for i in {0..11} do v=${1:i:1} checksum=$((checksum+factor*v)) factor=$((factor^2)) #printf >&2 'v: %s : cs=%d f=%d\n' "$v" $checksum $factor done if [[ ${#1} -eq 12 ]] then echo "$1"$((10-checksum%10)) else [[ $((10-checksum%10)) -eq ${1:12} ]] || exit fi shift done