Risposte:
if (( RANDOM % 2 )); then C1; else C2; fi
== 0
è implicito in ((
blocchi senza confronto, quindi non sono sicuro di cosa tu voglia dire.
== 0
è un errore di battitura nel mio commento precedente, voglio dire > 0
è implicito. Poiché % 100
restituirà quasi sempre un valore superiore 0
, è previsto.
RANDOM % $N
senza == 0
? IMO, ad esempio con N = 100, è molto più pragmatico desiderare una probabilità 1 su 100 (consegnato con == 0
) rispetto a una probabilità 99 su 100 (consegnato senza == 0
).
Nel tuo caso speciale:
C$((RANDOM%2+1))
funzionerà :) Ehi, è la risposta più breve!
$((1+1))
-> 2
, ad es. $(( ))
calcola cosa c'è dentro.
Puoi fare qualcosa del genere in Bash:
$ (( RANDOM%2 == 0 )) && C1 || C2
Questo genererà un numero casuale, 0 o 1. Se è uno 0, allora C1 viene eseguito, altrimenti C2 viene eseguito in caso contrario.
$ (( RANDOM%2 == 0 )) && echo 0 || echo 1
1
$ (( RANDOM%2 == 0 )) && echo 0 || echo 1
0
NOTA: il primo carattere $
, è il prompt.
Se ti preoccupi che C1 debba fallire in modo che C2 possa funzionare puoi ristrutturare quanto sopra in questo modo:
(( RANDOM%2 == 0 )) && CMD=C1 || CMD=C2
$CMD
Questa risposta è stata un po 'criticata, ma c'è un metodo per la mia follia. Sebbene questo schema possa sembrare più oscuro di un if / allora lo trovo più leggibile e compatto quando si fa qualcosa del tipo:
#!/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
fallisce, il che viola le specifiche stabilite nella domanda (vale a dire che viene eseguito solo uno dei comandi). x && y || z
non è equivalente a if x; then y; else z; fi
.
C1
è un comando che a volte restituisce un codice di uscita diverso da zero, finirai per eseguire entrambi C1
e C2
quando ciò accade.
((...))
invece di [...]
- le doppie parentesi sono specifiche per le espressioni aritmetiche.
(( RANDOM % N == 0 ))
invece di(( RANDOM % N ))
. È solo nel caso speciale di N = 2 che hanno probabilità identiche.