如何生成Luhn顺序号并将其保存在linux中?

时间:2017-01-03 05:38:55

标签: bash luhn

我正在生成(19位)序列号,如下所示:

seq 1234496713247997000 1234496713247998000 > seq_numbers.txt

然后使用luhn检查器在线验证它们。我不是采用两步法,而是像bash脚本那样一次性完成,只输出有效数字到文件中?

2 个答案:

答案 0 :(得分:1)

  

我没有从下面声明luhn checker算法的真实性。这是Rosetta Code页面的参考。

您可以将其用作

#!/bin/bash

function luhn_validate
{
    num=$1
    shift 1

    len=${#num}
    is_odd=1
    sum=0
    for((t = len - 1; t >= 0; --t)) {
        digit=${num:$t:1}

        if [[ $is_odd -eq 1 ]]; then
            sum=$(( sum + $digit ))
        else
            sum=$(( $sum + ( $digit != 9 ? ( ( 2 * $digit ) % 9 ) : 9 ) ))
        fi

        is_odd=$(( ! $is_odd ))
    }

    # NOTE: returning exit status of 0 on success
    return $(( 0 != ( $sum % 10 ) ))
}


for i in $(seq 1234496713247997000 1234496713247998000)
do
    if luhn_validate "$i"; then
        echo "$i is valid"
    else
        echo "$i is not valid"
    fi
done

您可以将其作为script.sh添加到脚本中,并设置执行权限chmod +x script.sh并以

运行
$ ./script.sh

我能够使其在GNU bash, version 4.3.46(2)-release (x86_64-pc-msys)上运行,并且尚未在其他系统上进行测试。

P.S。:使用它需要您自担风险!

答案 1 :(得分:0)

为什么要全部检查?只需生成最后一位数字! 快了三倍!

#!/bin/bash
# https://stackoverflow.com/questions/41437080
# answer corrected By Zibri

function luhn_generate_last_digit
{
    num=$1
    shift 1

    len=${#num}
    is_odd=1
    sum=0
    for((t = len - 1; t >= 0; --t)) {
        digit=${num:$t:1}

        if [[ $is_odd -eq 1 ]]; then
            sum=$(( sum + $digit ))
        else
            sum=$(( $sum + ( $digit != 9 ? ( ( 2 * $digit ) % 9 ) : 9 ) ))
        fi

        is_odd=$(( ! $is_odd ))
    }
    if [ $(( $sum % 10 )) -eq 0 ]; then sum=0;else sum=$(( $sum % 10 ));fi

    # NOTE: returning exit status of 0 on success
    echo -n $(( 10 - $sum  ))
}


for i in $(seq 123449671324799700 123449671324799800)
do
        echo "$i"$(luhn_generate_last_digit "$i")
done