Executar comandos aleatoriamente

24

Eu quero executar um dos dois comandos C1e C2aleatoriamente. Como faço isso na linha de comando (bash)? Apreciará se um one-liner é possível.

user13107
fonte

Respostas:

33
if (( RANDOM % 2 )); then C1; else C2; fi
Chris Down
fonte
1
Lembre-se de que, se você deseja uma chance de 1 em N de executar C1, provavelmente deve usar em (( RANDOM % N == 0 ))vez de (( RANDOM % N )). É apenas o caso especial de N = 2 que estes têm probabilidade idêntica.
Acumenus
O @ABB == 0está implícito em ((blocos sem comparação, por isso não sei o que você quer dizer.
Chris Baixo
@ABB == 0é um erro de digitação no meu comentário anterior, quero dizer, > 0está implícito. Como % 100quase sempre retornará um valor acima 0, isso é esperado.
187 Chris Down
2
Simplificando, de que uso prático seria RANDOM % $Nsem == 0? Na IMO, por exemplo, com N = 100, é muito mais pragmático querer uma chance de 1 em 100 (entregue com == 0) do que uma chance de 99 em 100 (entregue sem == 0).
Acumenus 8/07
21

No seu caso especial:

C$((RANDOM%2+1))

vai funcionar :) E ei, é a resposta mais curta!

gniourf_gniourf
fonte
Por que ele precisa de dois conjuntos de parênteses em torno dele? Só não estou muito familiarizado com o que você usou.
precisa saber é o seguinte
2
@AJMansfield $((1+1))-> 2, por exemplo. $(( ))calcula o que está dentro.
Tyilo 3/07/2013
3
Seria ainda mais curto se o OP escolhesse C0 e C1. Talvez ele não seja um programador?
3--13
2
Tenho certeza de que C1 e C2 eram espaços reservados em vez de comandos reais para executar. :-)
Chris Down
Que bonitinho. +1
sudo
5

Você pode fazer algo assim no Bash:

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

Isso gerará um número aleatório, 0 ou 1. Se for um 0, C1 será executado, caso contrário, C2 será executado se não for.

exemplo

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

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

NOTA: O primeiro caractere $, é o prompt.

outro exemplo

Se você está preocupado com o fato de C1 ter que falhar para que o C2 possa ser executado, você pode reestruturar o acima descrito da seguinte maneira:

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

por que usar isso em uma declaração if / then?

Esta resposta foi criticada um pouco, mas há um método para a minha loucura. Embora esse padrão possa parecer mais obscuro do que um if / then, acho mais legível e compacto ao fazer algo como o seguinte:

#!/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

Referências

slm
fonte
2
Isso será executado C2se C1falhar, o que viola a especificação apresentada na pergunta (ou seja, que apenas um dos comandos seja executado). x && y || znão é equivalente a if x; then y; else z; fi.
31413 Chris Down
@ ChrisDown - veja mods.
Slm
4
A edição corrige nominalmente isso, mas é realmente obscura. "Se você está preocupado com o fato de C1 ter que falhar para que o C2 possa ser executado" não captura o cenário. O problema é que, se C1um comando às vezes retorna um código de saída diferente de zero, você acaba executando ambos C1e C2quando isso acontece.
Tripleee
+1, mas use em ((...))vez de [...]- parênteses duplos são especificamente para expressões aritméticas.
Glenn Jackman
@glennjackman - obrigado, eu fiz a alteração.
Slm