将 /dev/urandom 的内容放入变量中?

将 /dev/urandom 的内容放入变量中?

这是我之前的主题的后续内容:- 将日期命令传递给变量?

好吧,我希望 /dev/urandom 为我生成 4 位数字。并将它们放入变量中。

这是我的 bash 脚本的示例:-

#!/bin/bash
for (( c=0; c<=10; c++))
do
        a="$(tr -dc '[:digit:]' < /dev/urandom | fold -w 4)"

        echo $a
done

我希望“回显”结果的唯一原因是这样我实际上可以看到 /dev/urandom 已正确为我生成了 4 位数字。

对于我想要制作的 bash 脚本,我需要以编程方式执行此操作,因为我希望对生成的结果进行进一步的操作。

所以我不需要“回显”结果。也是如此a="$(tr -dc '[:digit:]' < /dev/urandom | fold -w 4)"

实际上将 4 个随机数字放入变量“a”中?当我从脚本中回显“a”时,我只是得到一个悬挂的控制台,并且必须使用“CTRL+C”来恢复我的控制台。

我想做的就是将 /dev/urandom 中的 4 个随机数字放入变量中。

我是 bash 脚本新手,所以欢迎所有建议,并提前感谢您的任何帮助或建议。

答案1

如果你不需要安全性,你可以使用bash的内置RANDOM多变的。要获得 0 到 9999(含)之间的随机数,$((RANDOM % 10000))会对小于 767 的值产生较小的偏差,因为 的值$RANDOM在 [0, 32767] 范围内是均匀的。要获得均匀分布,并放置前导零:

while a=$((RANDOM + 10000)); ((a <= 39999)); do :; done
a=${a#?}

再次注意,这不适用于任何涉及安全的地方。的输出$RANDOM是不可预测的。

如果您确实需要安全性,那么这/dev/urandom是获取随机数据的正确位置。在大多数当前的 unice 上,调用fold是不必要的:您可以使用 . 来获取 4 个字符head -c

a=$(</dev/urandom tr -dc 0-9 | head -c 4)

head -c不是 POSIX,也不存在于 OpenBSD 上,但它存在于其他 BSD 和 Linux 上(均使用 GNU coreutils 和 BusyBox)。

如果您需要移植到没有 的系统head -c,那么fold -w 4 | head -n 1POSIX 标准是一个很好的替代品。请注意,您确实需要调用head,否则fold将永远保留 4 位数的输出行。

答案2

fold只会折叠无限的数字流,因此a被无限期地定义。您将需要添加一个终止命令,最简单head

 a="$(tr -dc '[:digit:]' < /dev/urandom | fold -w 4 | head -n1)"

只需比较这两个命令的行为

tr -dc '[:digit:]' < /dev/urandom | fold -w 4  
tr -dc '[:digit:]' < /dev/urandom | fold -w 4 | head -n1

第一个将显示无限的 4 位随机数流,而第二个将在一行后中止。

相关内容