Respostas:
if (( RANDOM % 2 )); then C1; else C2; fi
== 0
está implícito em ((
blocos sem comparação, por isso não sei o que você quer dizer.
== 0
é um erro de digitação no meu comentário anterior, quero dizer, > 0
está implícito. Como % 100
quase sempre retornará um valor acima 0
, isso é esperado.
RANDOM % $N
sem == 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
).
No seu caso especial:
C$((RANDOM%2+1))
vai funcionar :) E ei, é a resposta mais curta!
$((1+1))
-> 2
, por exemplo. $(( ))
calcula o que está dentro.
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.
$ (( RANDOM%2 == 0 )) && echo 0 || echo 1
1
$ (( RANDOM%2 == 0 )) && echo 0 || echo 1
0
NOTA: O primeiro caractere $
, é o prompt.
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
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
C2
se C1
falhar, o que viola a especificação apresentada na pergunta (ou seja, que apenas um dos comandos seja executado). x && y || z
não é equivalente a if x; then y; else z; fi
.
C1
um comando às vezes retorna um código de saída diferente de zero, você acaba executando ambos C1
e C2
quando isso acontece.
((...))
vez de [...]
- parênteses duplos são especificamente para expressões aritméticas.
(( RANDOM % N == 0 ))
vez de(( RANDOM % N ))
. É apenas o caso especial de N = 2 que estes têm probabilidade idêntica.