![如何在 Bash 中运行命令 N 次中的 1 次](https://linux22.com/image/159956/%E5%A6%82%E4%BD%95%E5%9C%A8%20Bash%20%E4%B8%AD%E8%BF%90%E8%A1%8C%E5%91%BD%E4%BB%A4%20N%20%E6%AC%A1%E4%B8%AD%E7%9A%84%201%20%E6%AC%A1.png)
我想要一种随机运行命令的方法,比如十分之一的运行命令。是否有内置或 GNU coreutil 可以执行此操作,最好是这样的:
chance 10 && do_stuff
哪里do_stuff
只执行了十分之一?我知道我可以编写一个脚本,但这似乎是一个相当简单的事情,我想知道是否有一个定义的方法。
答案1
在ksh
、Bash、Zsh、Yash 或 BusyBox中sh
:
[ "$RANDOM" -lt 3277 ] && do_stuff
Korn、Bash、Yash、Z 和 BusyBox shell 的特殊变量RANDOM
每次计算时都会生成一个介于 0 到 32767 之间的伪随机十进制整数值,因此上面给出(接近)十分之一的机会。
您可以使用它来生成一个功能,其行为如您的问题中所述,至少在 Bash 中:
function chance {
[[ -z $1 || $1 -le 0 ]] && return 1
[[ $RANDOM -lt $((32767 / $1 + 1)) ]]
}
忘记提供参数或提供无效参数将产生结果 1,因此chance && do_stuff
永远不会do_stuff
。
这使用了“1 inn” 使用$RANDOM
,即[[ $RANDOM -lt $((32767 / n + 1)) ]]
,给出 (⎣32767 /n⎦ + 1) 32768 机会。n
不是 32768 因子的值会引入偏差,因为可能值范围的划分不均匀。
答案2
非标解决方案:
[ $(date +%1N) == 1 ] && do_stuff
检查当前时间(以纳秒为单位)的最后一位是否为 1!
答案3
使用的替代方法$RANDOM
是shuf
命令:
[[ $(shuf -i 1-10 -n 1) == 1 ]] && do_stuff
会做这项工作。对于从文件中随机选择行也很有用,例如。用于音乐播放列表。
答案4
我不确定你想要随机性还是周期性......对于周期性:
for i in `seq 1 10 100`; do echo $i;done
1
11
21
31
41
51
61
71
81
91
您可以将其与上面的“$RANDOM”技巧混合以产生更混乱的东西,例如:
对于我来说seq 1 1000 $RANDOM
;做回显$i;完成
哈:-)