我正在生成(19位)序列号,如下所示:
seq 1234496713247997000 1234496713247998000 > seq_numbers.txt
然后使用 luhn 检查器在线验证它们。而不是做一个两步的方法,我怎么能像一个bash脚本一样一次性完成,并且只输出有效的数字到文件?
为什么要全部检查?只需生成最后一位数字!它快了 3 倍!
#!/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
我不会从下面声称 luhn 检查器算法的真实性。这是来自此Rosetta 代码页面的参考。
您可以将其用作
#!/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)
并且没有在其他系统上测试它。
PS:使用风险自负!