使用“正常”(我的意思是完整的)Linux 发行版,它可以正常工作:
sleep $(echo "$[ ($RANDOM % 10 ) ]")
好的,它等待大约0-9秒。
但在 OpenWRT 下 [不是使用bash
,而是ash
]:
$ sleep $(echo "$[ ($RANDOM % 9 ) ]")
sleep: invalid number '$['
$
以及原因:
$ echo "$[ ($RANDOM % 9 ) ]"
$[ ( % 9 ) ]
$
那么有人有办法在 OpenWRT 下生成随机数,以便我可以将其置于“睡眠”状态吗?
答案1
Ash 无法理解$[]
,因此它在 Bash 中已被弃用。此外,echo
没有必要。对于 Bash 和 Ash,请使用以下替代:
sleep $(( $RANDOM % 10 ))
答案2
还请考虑到 OpenWrt 中包含的 Busybox 通常没有编译$RANDOM
。
如果在编译时选择OpenWrt buildroot 中的BUSYBOX_CUSTOM
和配置选项,您就可以拥有它。BUSYBOX_CONFIG_ASH_RANDOM_SUPPORT
否则,您可以使用如下命令:
hexdump -n 2 -e \"%u\" /dev/urandom
这会生成一个介于 0 和 65535 之间的数字。因此,如果您想运行 0-9 秒的睡眠,您可以执行以下操作:
sleep $(($(hexdump -n 2 -e \"%u\" /dev/urandom) % 10))
其中$((... % 10))
需要将 0-65535 空间减少到 0-9。
答案3
这是一种生成 0 到 9 之间(含)整数的(不可靠)方法:
sleep $(head -30 /dev/urandom | tr -dc "0123456789" | head -c1)
这会从 读取 30 行/dev/urandom
,使用tr
丢弃所有非数字字符,然后仅抓取剩余数字的第一个字符。这是不可靠的,因为有可能(可能性非常低)会/dev/urandom
产生 30 行恰好包含没有数字。
这可以扩展为生成一个三位数(范围为 0-999),如下所示:
$(head -30 /dev/urandom | tr -dc "0123456789" | head -c3)