这是我之前的主题的后续内容:- 将日期命令传递给变量?
好吧,我希望 /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 1
POSIX 标准是一个很好的替代品。请注意,您确实需要调用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 位随机数流,而第二个将在一行后中止。