Esegui i comandi a caso


24

Voglio eseguire uno dei due comandi C1e C2in modo casuale. Come posso farlo sulla riga di comando (bash)? Apprezzerò se è possibile un liner.

Risposte:


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

1
Tieni presente che se vuoi una probabilità 1 in N di eseguire C1, probabilmente devi usare (( RANDOM % N == 0 ))invece di (( RANDOM % N )). È solo nel caso speciale di N = 2 che hanno probabilità identiche.
Acumenus,

@ABB == 0è implicito in ((blocchi senza confronto, quindi non sono sicuro di cosa tu voglia dire.
Chris Giù

@ABB == 0è un errore di battitura nel mio commento precedente, voglio dire > 0è implicito. Poiché % 100restituirà quasi sempre un valore superiore 0, è previsto.
Chris Down,

2
In parole povere, di quale uso pratico sarebbe RANDOM % $Nsenza == 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).
Acumenus,

21

Nel tuo caso speciale:

C$((RANDOM%2+1))

funzionerà :) Ehi, è la risposta più breve!


Perché ha bisogno di due serie di parentesi attorno? Non ho molta familiarità con qualunque cosa tu abbia usato.
AJMansfield

2
@AJMansfield $((1+1))-> 2, ad es. $(( ))calcola cosa c'è dentro.
Tyilo,

3
Sarebbe ancora più breve se l'OP scegliesse C0 e C1. Forse non è un programmatore?
ott--

2
Sono abbastanza sicuro che C1 e C2 fossero segnaposto anziché effettivi comandi da eseguire. :-)
Chris Down

Che carino. +1
sudo,

5

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.

esempio

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

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

NOTA: il primo carattere $, è il prompt.

un altro esempio

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

perché usarlo su un'istruzione if / then?

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

Riferimenti


2
Questo funzionerà C2se C1fallisce, il che viola le specifiche stabilite nella domanda (vale a dire che viene eseguito solo uno dei comandi). x && y || znon è equivalente a if x; then y; else z; fi.
Chris Down,

@ChrisDown - vedi le mod.
slm

4
La modifica lo risolve nominalmente, ma è davvero oscuro. "Se sei preoccupato che C1 debba fallire in modo che C2 possa funzionare" non cattura affatto lo scenario. Il problema è che se C1è un comando che a volte restituisce un codice di uscita diverso da zero, finirai per eseguire entrambi C1e C2quando ciò accade.
triplo

+1 ma usa ((...))invece di [...]- le doppie parentesi sono specifiche per le espressioni aritmetiche.
Glenn Jackman,

@glennjackman - grazie ho apportato la modifica.
slm
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.