随机运行命令


24

我想运行这两个命令之一C1,并C2在随机的。如何在命令行(bash)上执行此操作?如果单线可行,将不胜感激。

Answers:


33
if (( RANDOM % 2 )); then C1; else C2; fi

1
请记住,如果您希望N的几率是C1,则可能必须使用(( RANDOM % N == 0 ))而不是(( RANDOM % N ))。在N = 2的特殊情况下,它们具有相同的概率。
Acumenus

@ABB == 0隐含在((没有比较的块中,因此我不确定您的意思。
克里斯·

@ABB == 0是我以前的评论中的错字,我的意思> 0是隐式的。由于% 100几乎总是会返回一个高于的值0,这是预期的。
克里斯·

2
说白放,什么实际的用途是RANDOM % $N== 0?IMO(例如,N = 100 == 0)比100中的99(不提供== 0)要多100的可能性(带交付)要实用得多。
Acumenus

21

在您的特殊情况下:

C$((RANDOM%2+1))

会起作用:)嘿,这是最短的答案!


为什么在它周围需要两组括号?我只是对您使用的内容不太熟悉。
AJMansfield

2
@AJMansfield- $((1+1))> 2,例如。$(( ))计算里面的东西。
Tyilo

3
如果OP选择C0和C1,则将更短。也许他不是程序员?
ott--

2
我很确定C1和C2是占位符,而不是实际运行的命令。:-)
克里斯·

那很可爱。+1
sudo

5

您可以在Bash中执行以下操作:

$ (( RANDOM%2 == 0 )) && C1 || C2

这将生成一个随机数,即0或1。如果为0,则C1运行,否则,则C2运行。

$ (( RANDOM%2 == 0 )) && echo 0 || echo 1
1

$ (( RANDOM%2 == 0 )) && echo 0 || echo 1
0

注意:第一个字符$,是提示。

另一个例子

如果您担心C1必须失败以使C2可以运行,则可以像上面这样重组:

(( RANDOM%2 == 0 )) && CMD=C1 || CMD=C2
$CMD

为什么在if / then语句上使用它?

这个答案已经被批评了一下,但是有一种使我疯狂的方法。尽管这种模式似乎比if / then更加晦涩难懂,但在执行以下操作时,我发现它更易读和紧凑:

#!/bin/bash
CMD=""
DIRS="/etc /home /www /data1 /data2 /var/log /var/spool/mail"
FILE="/backup/$(hostname)-$(date +'%m-%d-%y').tar.gz"
[ "$1" == "nas" ]  && CMD="lftp -u user,password -e 'cd /dump/; mput /backup/*; quit' nas.mylan.com" || :
[ "$1" == "scp" ]  && CMD="scp /backup/* scponly@dumpserver:incoming' username" || :
[ "$1" == "tape" ] && CMD='tar -cf /dev/st0 /backup/*' || :
[ "$CMD" == "" ]   && exit 1 || :
# make a backup
tar -zcvf  $FILE $DIRS
# Now depend upon circumstances run a backup command
$CMD

参考文献


2
C2如果C1失败,这将运行,这将违反问题中列出的规范(即,仅运行其中一个命令)。x && y || z不等同于if x; then y; else z; fi
克里斯·

@ChrisDown-参见mods。
slm

4
该编辑名义上可以解决此问题,但是确实很模糊。“如果您担心C1必须失败以使C2可以运行”,则根本无法捕获该场景。问题是,如果C1某条命令有时返回一个非零的退出代码,那么您最终将同时执行这两个命令C1和执行C2该操作的时间。
2013年

+1,但用((...))代替[...]-双括号专门用于算术表达式。
glenn jackman

@glennjackman-谢谢,我进行了更改。
slm
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.