如何生成Luhn序号并保存在linux中?
How to generate Luhn Sequential numbers and save them in linux?
我正在生成(19 位)序列号,如下所示:
seq 1234496713247997000 1234496713247998000 > seq_numbers.txt
然后使用 luhn 检查器在线验证它们。而不是采用两步法,我如何才能像 bash 脚本那样一次性完成此操作,并仅将有效数字输出到文件?
I do not claim the truthfulness of the luhn checker algorithm from below. It is a reference from this Rosetta Code page.
您可以将其用作
#!/bin/bash
function luhn_validate
{
num=
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.: 使用风险自负!
为什么要全部检查?只需生成最后一位数字!
快了 3 倍!
#!/bin/bash
#
# answer corrected By Zibri
function luhn_generate_last_digit
{
num=
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
我正在生成(19 位)序列号,如下所示:
seq 1234496713247997000 1234496713247998000 > seq_numbers.txt
然后使用 luhn 检查器在线验证它们。而不是采用两步法,我如何才能像 bash 脚本那样一次性完成此操作,并仅将有效数字输出到文件?
I do not claim the truthfulness of the luhn checker algorithm from below. It is a reference from this Rosetta Code page.
您可以将其用作
#!/bin/bash
function luhn_validate
{
num=
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.: 使用风险自负!
为什么要全部检查?只需生成最后一位数字! 快了 3 倍!
#!/bin/bash
#
# answer corrected By Zibri
function luhn_generate_last_digit
{
num=
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