Aleatoriedad y aleatoriedad ponderada en Shell Script
Trabajando con aleatoriedades, hay veces que queremos que todas las opciones tengan las mismas posibilidades de ocurrir. Como si lanzamos una moneda que no esté trucada y unas veces saldrá cara y otras veces saldrá cruz.
#!/bin/bash coin=$(shuf -i 0-1 -n 1) if [ $coin -eq 0 ] then echo "Hola, "$USER else echo "Hola, "$USER", ¿qué tal estás?" fi
Con shuf -i 0-1 -n 1 generamos una lista de números que van desde 0 a 1 (-i 0-1) y, de esa lista, extraemos un elemento (-n 1), por lo tanto, lo que recibimos en la variable coin es un 1 o un 0, con las mismas posibilidades de recibir uno u otro valor.
En la siguiente línea, comprobamos si el valor de coin es 0. Si es así, ejecuta un bloque de código y si no, ejecuta otro bloque de código. Comparamos la igualdad con -eq.
En caso de que trabajemos con más posibilidades, es más cómodo usar case:
#!/bin/bash dice=$(shuf -i 1-6 -n 1) case $dice in 1) echo "Hola, "$USER"." ;; 2) echo "Hola, ¿qué tal estás?" ;; 3) echo "Hola, "$USER", ¿qué tal estás?" ;; 4) echo "¿Qué tal estás, $USER?" ;; 5) echo "Hola, ¿qué tal, "$USER"?" ;; 6) echo "¿Qué tal, "$USER"? Me alegro de saludarte." ;; esac
Hemos convertido la moneda, con sus dos opciones de cara y cruz por un dado con 6 opciones que tienen las mismas posibilidades de ocurrir (shuf -i 1-6 -n 1).
Si queremos que haya más posibilidades de que se ejecute un bloque de código que otro, podemos combinar las dos opciones anteriores: por un lado, extraemos aleatoriamente un número alto y sólo se ejecuta un bloque de código cuando se de un resultado concreto:
#!/bin/bash dice=$(shuf -i 1-6 -n 1) if [ $dice -eq 1 ] then echo "Hola, "$USER else echo "Hola, "$USER", ¿qué tal estás?" fi