35 lines
853 B
Bash
35 lines
853 B
Bash
declare -A base36=(
|
|
[A]=10 [B]=11 [C]=12 [D]=13 [E]=14 [F]=15 [G]=16 [H]=17 [I]=18
|
|
[J]=19 [K]=20 [L]=21 [M]=22 [N]=23 [O]=24 [P]=25 [Q]=26 [R]=27
|
|
[S]=28 [T]=29 [U]=30 [V]=31 [W]=32 [X]=33 [Y]=34 [Z]=35
|
|
)
|
|
|
|
function is_iban {
|
|
local -u acct=${1//[^[:alnum:]]/}
|
|
acct=${acct:4}${acct:0:4}
|
|
local i char digits=""
|
|
for ((i=0; i<${#acct}; i++)); do
|
|
char=${acct:i:1}
|
|
digits+=${base36[$char]:-$char}
|
|
done
|
|
local mod=$(mod97 $digits)
|
|
(( mod == 1 ))
|
|
}
|
|
|
|
function mod97 {
|
|
local D=$1
|
|
N=${D:0:9}
|
|
D=${D:9}
|
|
while [[ -n $D ]]; do
|
|
mod=$(( N % 97 ))
|
|
N=$(printf "%02d%s" $mod ${D:0:7})
|
|
D=${D:7}
|
|
done
|
|
echo $(( N % 97 ))
|
|
}
|
|
|
|
for test in "GB82 WEST 1234 5698 7654 32" "GB42 WEST 1234 5698 7654 32"; do
|
|
printf "%s : " "$test"
|
|
is_iban "$test" && echo yes || echo no
|
|
done
|