Executa comandos aleatoriamente

22

Eu quero executar um dos dois comandos C1 e C2 aleatoriamente. Como faço isso na linha de comando (bash)? Apreciará se um one-liner for possível.

    
por user13107 03.07.2013 / 06:19

3 respostas

31
if (( RANDOM % 2 )); then C1; else C2; fi
    
por 03.07.2013 / 06:28
21

No seu caso especial:

C$((RANDOM%2+1))

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

    
por 03.07.2013 / 11:48
5

Você pode fazer algo parecido com isso no Bash:

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

Isso gerará um número aleatório, 0 ou 1. Se for 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 o C1 ter que falhar para que o C2 possa ser executado, você pode reestruturá-lo da seguinte forma:

(( 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 minha loucura. Embora esse padrão possa parecer mais obscuro que um if /, eu 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

por 03.07.2013 / 06:29

Tags