Tenga en cuenta que si desea una probabilidad de 1 en N de ejecutar C1, probablemente deba usar en (( RANDOM % N == 0 ))lugar de (( RANDOM % N )). Es solo en el caso especial de N = 2 que tienen una probabilidad idéntica.
Acumenus
@ABB == 0está implícito en ((bloques sin comparación, por lo que no estoy seguro de lo que quieres decir.
Chris Down
@ABB == 0es un error tipográfico en mi comentario anterior, quiero decir, > 0está implícito. Dado % 100que casi siempre devolverá un valor anterior 0, eso se espera.
Chris Down
2
En pocas palabras, ¿ RANDOM % $Nsin 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).
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
¿Por qué usar esto sobre una declaración if / then?
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
Esto se ejecutará C2si C1falla, lo que viola la especificación establecida en la pregunta (es decir, que solo se ejecuta uno de los comandos). x && y || zNo es equivalente a if x; then y; else z; fi.
Chris Down
@ChrisDown - ver mods.
slm
44
La edición nominalmente corrige esto, pero es realmente oscuro. "Si le preocupa que C1 tenga que fallar para que C2 pueda ejecutarse" no captura el escenario en absoluto. El problema es que si C1es un comando que a veces devuelve un código de salida distinto de cero, terminará ejecutando ambos C1y C2cuando eso suceda.
tripleee
+1 pero use en ((...))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.== 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 anterior0
, 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:
funcionará :) Y oye, ¡es la respuesta más corta!
fuente
$((1+1))
->2
, por ejemplo.$(( ))
calcula lo que hay dentro.Puedes hacer algo como esto en Bash:
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.
ejemplo
NOTA: El primer carácter
$
,, es el indicador.otro ejemplo
Si le preocupa que C1 tenga que fallar para que C2 pueda ejecutarse, puede reestructurar lo anterior de la siguiente manera:
¿Por qué usar esto sobre una declaración if / then?
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:
Referencias
fuente
C2
siC1
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 aif x; then y; else z; fi
.C1
es un comando que a veces devuelve un código de salida distinto de cero, terminará ejecutando ambosC1
yC2
cuando eso suceda.((...))
lugar de[...]
- los paréntesis dobles son específicamente para expresiones aritméticas.