首页 > 解决方案 > 随机生成发票 ID - 将文本数据库移动到脚本文件中?

问题描述

我想出了以下bash脚本来随机生成发票编号,通过将所有生成的编号记录到文本文件“数据库”来防止重复。

令我惊讶的是,该脚本确实有效,而且看起来很健壮(尽管我很高兴在这个早期阶段而不是以后向我指出任何缺陷)。

我现在想知道的是,是否有可能将生成数字的“数据库”移动到脚本文件本身中。这将允许我只依赖和跟踪一个文件,而不是两个单独的文件。

这有可能吗?如果有,怎么做?如果这不是一个好主意,那么有什么正当理由不这样做呢?

#!/usr/bin/env bash

generate_num() {
#num=$(head /dev/urandom | tr -dc '[:digit:]' | cut -c 1-5) [Original method, no longer used]
num=$(shuf -i 10000-99999 -n 1)
}

read -p "Are you sure you want to generate a new invoice ID? [Y/n] " -n 1 -r
echo
    if [[ $REPLY =~ ^[Yy]$ ]] 
    then
        generate_num && echo Generating a random invoice ID and checking it against the database...
        sleep 2

        while grep -xq "$num" "ID_database"
            do
                echo Invoice ID \#$num already exists in the database...
                sleep 2
                generate_num && echo Generating new random invoice ID and checking against database...
                sleep 2
            done

        while [[ ${#num} -gt 5 ]]
            do
                echo Invoice ID \#$num is more than 5 digits...
                sleep 2
                generate_num && echo Generating new random invoice ID and checking against database...
                sleep 2
          done

        echo Generated random invoice ID \#$num
        sleep 1
        echo Invoice ID \#$num does not exist in database...
        sleep 2
        echo $num >> "ID_database" && echo Successfully added Invoice ID \#$num to the database.

    else 
        echo "Exiting..."
    fi

标签: databasebashshellrandom

解决方案


已编辑

要回答您提出的问题-

确保您的文件以明确的exit语句结尾。如果没有某种分支,它将无法执行,因此除非存在严重的解析错误,否则下面的任何内容可以用作存储空间。只是

echo $num >> $0

如果您将记录直接写在脚本的底部,脚本会变长,但……相对无害。只要确保您的grep模式不会占用任何代码行,尽管grep -E '^\d[%]$'看起来很安全。


这只会给您最多约 90k 的 id,并且会花费不必要的时间和周期进行冗余检查。值的长度有限制吗?

如果您能保证每秒处理的发票不会超过一张,

date +%s >> "ID_database" # the UNIX epoch, seconds since 00:00:00 01/01/1970

如果您需要更高的精度,

date +%Y%m%d%H%M%S%N

将输出年月日时分秒纳秒,既即时又“非常安全”。

date +%s%N # epoch with nanoseconds

更短,但没有自动为您提供发票创建日期和时间的便利副作用。

如果您绝对需要保证唯一性并且纳秒还不够好,请使用某种锁,也许是更细粒度的语言。

另一方面,如果分钟足够独特,您可以使用

 date +%y%m%d%H%M

你明白了。


推荐阅读