retnikt Asked: 2019-09-01 00:14:04 +0800 CST2019-09-01 00:14:04 +0800 CST 2019-09-01 00:14:04 +0800 CST 如何在 Bash 中运行 N 次命令中的 1 次 772 我想要一种随机运行命令的方法,比如 10 次中的 1 次。是否有内置或 GNU coreutil 来执行此操作,理想情况下是: chance 10 && do_stuff 哪里do_stuff只执行了 10 次?我知道我可以写一个脚本,但这似乎是一件相当简单的事情,我想知道是否有一个定义的方法。 bash gnu 5 个回答 Voted Best Answer Stephen Kitt 2019-09-01T00:27:04+08:002019-09-01T00:27:04+08:00 在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。 这使用了“ n中的 1 ”的通用公式$RANDOM,即[[ $RANDOM -lt $((32767 / n + 1)) ]],在 32768 中给出 (⎣32767 / n ⎦ + 1) 的机会。n不是 32768 的因子的值会引入偏差,因为可能值范围内的拆分不均匀。 stackzebra 2019-09-01T09:37:38+08:002019-09-01T09:37:38+08:00 非标解决方案: [ $(date +%1N) == 1 ] && do_stuff 检查当前时间(以纳秒为单位)的最后一位是否为 1! seumasmac 2019-09-01T05:58:59+08:002019-09-01T05:58:59+08:00 使用的替代方法$RANDOM是shuf命令: [[ $(shuf -i 1-10 -n 1) == 1 ]] && do_stuff 将完成这项工作。对于从文件中随机选择行也很有用,例如。对于音乐播放列表。 Eisenknurr 2019-09-02T06:35:12+08:002019-09-02T06:35:12+08:00 改进第一个答案并使您想要实现的目标更加明显: [ $(( $RANDOM % 10 )) == 0 ] && echo "You win" || echo "You lose" Dr_ST 2019-09-01T06:55:36+08:002019-09-01T06:55:36+08:00 我不确定你是否想要随机性或周期性......对于周期性: 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;完成 HTH :-)
在
ksh
、Bash、Zsh、Yash 或 BusyBox 中sh
:Korn、Bash、Yash、Z 和 BusyBox shell的
RANDOM
特殊变量在每次评估时都会产生一个介于 0 和 32767 之间的伪随机十进制整数值,因此上面给出(接近)十分之一的机会。您可以使用它来生成一个行为如您的问题中所述的函数,至少在 Bash 中:
忘记提供参数或提供无效参数将产生结果 1,因此
chance && do_stuff
永远不会do_stuff
。这使用了“ n中的 1 ”的通用公式
$RANDOM
,即[[ $RANDOM -lt $((32767 / n + 1)) ]]
,在 32768 中给出 (⎣32767 / n ⎦ + 1) 的机会。n
不是 32768 的因子的值会引入偏差,因为可能值范围内的拆分不均匀。非标解决方案:
[ $(date +%1N) == 1 ] && do_stuff
检查当前时间(以纳秒为单位)的最后一位是否为 1!
使用的替代方法
$RANDOM
是shuf
命令:将完成这项工作。对于从文件中随机选择行也很有用,例如。对于音乐播放列表。
改进第一个答案并使您想要实现的目标更加明显:
我不确定你是否想要随机性或周期性......对于周期性:
您可以将它与上面的“$RANDOM”技巧混合以产生更混乱的东西,例如:
我在
seq 1 1000 $RANDOM
;做回声$ i;完成HTH :-)