如何在 Bash 中运行命令 N 次中的 1 次

如何在 Bash 中运行命令 N 次中的 1 次

我想要一种随机运行命令的方法,比如十分之一的运行命令。是否有内置或 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

使用的替代方法$RANDOMshuf命令:

[[ $(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;完成

哈:-)

相关内容