我对此完全是新手,但我正在尝试将其他人的代码改编为越狱的 Kindle 3(电子阅读器)。
我正在使用以下代码生成一个介于 0 到 X 之间的随机(ish)数字(其中 X 是我拥有的图像数量,目前为 33),这样我就可以每隔这么多小时(目前每 2 小时)显示一个随机图像)cron
用于运行脚本。
#generate random number between my 33 images (compatible with busybox)
n=32
while [ $n -ge 32 ]; do
n=1$(</dev/urandom tr -dc 0-9 | dd bs=5 count=1 2>/dev/null)
n=$((n-100000))
done
ImageNumber=$n
#My images are numbered as follows - pic_0.png, pic_1.png, pic_3.png... etc
SelectedImage=$( find /mnt/us/timelit/images/pic_${ImageNumber}*.png)
# clear the screen
eips -c
# show that image
eips -g $SelectedImage
它正在工作,但是有几件事需要解决。
1)我认为脚本的随机数生成器部分存在问题,因为它在生成数字之前随时间变化(见下面的日志)
14:00:02: Script started
14:02:43: Random number is 2
14:02:44: Image shown is pic_2.png
15:00:02: Script started
15:00:19: Random number is 18
15:00:20: Image shown is pic_18.png
16:00:01: Script started
16:02:44: Random number is 10
16:02:45: Image shown is pic_10.png
2) Kindle 时不时地显示一个空白屏幕,而不是其中一个图像。我猜测生成的随机数存在问题,这意味着找不到具有匹配数字的 PNG,因此 Kindle 显示为空白。
任何帮助是极大的赞赏。
所以在这里你正在生成一个随机数 00000-99999 并且只有在它低于 32 时才会终止。100'000 中的概率为 32。如果前导 0 被解释为八进制数,它甚至可能导致无效的算术表达式问题。(编辑:哦,我想这就是你在前面加上 1 的原因)
无论哪种方式...都需要一段时间才能终止。并提出了为什么你不只使用
$RANDOM%32
. 对于较小的数字$RANDOM
(仅限于 0-32767)可以正常工作。如果
$RANDOM
Kindle 的busybox 中没有(如果可能CONFIG_ASH_RANDOM_SUPPORT=n
),您可以使用 ... 抓取一个数字,tr
或者hexdump
如果它可用,则直接使用它。在任何情况下,while 循环都是非常低效且毫无意义的。
没有循环的例子:
仍然有点低效,因为
tr
必须读取比您想要的 5 个更多的随机字节(256 个机会中的 10 个读取一个数字)。如果可用(
hexdump
读取固定的 3 个随机字节):如果您的 ImageNumber 为 1,则该表达式转换为
pic_1*.png
which could bepic_1.png
but alsopic_10-19.png
,pic-100-199.png
依此类推。如果文件名中没有多余的字符,请去掉 *. 否则,您需要另一个分隔符pic_${ImageNumber}_*.png
(以允许文件名如pic_1_spaceship.png
)。无论哪种方式,您都可以跳过查找并直接使用表达式:
请参阅frostschutz 的回答,了解您的代码为何无法正常运行。我将给出不同的解决方案。
如果您的 BusyBox 环境包含 awk,则更简单的方法是生成一个足以满足此应用程序的随机数
srand()
仅基于四舍五入到最接近秒的当前时间,因此在许多情况下它是不合适的(任何与安全相关的情况,任何每秒可能有超过一次随机抽取的情况)。但这里已经足够好了。与其为每张图片分配一个数字并硬编码数字范围,不如列出文件并随机选择一个。更确切地说:
您甚至可以让 awk 直接选择图像文件,但如果文件很多,您可能会遇到命令行长度限制。
(请注意,如果您有一个更完整的 bash 和 GNU 实用程序环境,那么会有更简单的方法来做一些事情。我的回答坚持每个 POSIX shell 和许多 BusyBox 安装中可用的功能。)