Quiero ejecutar uno de los dos comandos C1
y C2
al azar. ¿Cómo hago eso en la línea de comandos (bash)? Apreciará si una línea es posible.
Quiero ejecutar uno de los dos comandos C1
y C2
al azar. ¿Cómo hago eso en la línea de comandos (bash)? Apreciará si una línea es posible.
Respuestas:
if (( RANDOM % 2 )); then C1; else C2; fi
== 0
está implícito en ((
bloques sin comparación, por lo que no estoy seguro de lo que quieres decir.
== 0
es un error tipográfico en mi comentario anterior, quiero decir, > 0
está implícito. Dado % 100
que casi siempre devolverá un valor anterior 0
, eso se espera.
RANDOM % $N
sin qué uso práctico sería == 0
? OMI, por ejemplo con N = 100, es mucho más pragmático querer una probabilidad de 1 en 100 (entregada con == 0
) que una probabilidad de 99 en 100 (entregada sin == 0
).
En tu caso especial:
C$((RANDOM%2+1))
funcionará :) Y oye, ¡es la respuesta más corta!
$((1+1))
-> 2
, por ejemplo. $(( ))
calcula lo que hay dentro.
Puedes hacer algo como esto en Bash:
$ (( RANDOM%2 == 0 )) && C1 || C2
Esto generará un número aleatorio, ya sea 0 o 1. Si es un 0, entonces C1 se ejecuta; de lo contrario, C2 se ejecuta si no lo es.
$ (( RANDOM%2 == 0 )) && echo 0 || echo 1
1
$ (( RANDOM%2 == 0 )) && echo 0 || echo 1
0
NOTA: El primer carácter $
,, es el indicador.
Si le preocupa que C1 tenga que fallar para que C2 pueda ejecutarse, puede reestructurar lo anterior de la siguiente manera:
(( RANDOM%2 == 0 )) && CMD=C1 || CMD=C2
$CMD
Esta respuesta ha sido criticada un poco, pero hay un método para mi locura. Aunque este patrón puede parecer más oscuro que un si / entonces, lo encuentro más legible y compacto cuando hago algo como lo siguiente:
#!/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
si C1
falla, lo que viola la especificación establecida en la pregunta (es decir, que solo se ejecuta uno de los comandos). x && y || z
No es equivalente a if x; then y; else z; fi
.
C1
es un comando que a veces devuelve un código de salida distinto de cero, terminará ejecutando ambos C1
y C2
cuando eso suceda.
((...))
lugar de [...]
- los paréntesis dobles son específicamente para expresiones aritméticas.
(( RANDOM % N == 0 ))
lugar de(( RANDOM % N ))
. Es solo en el caso especial de N = 2 que tienen una probabilidad idéntica.