Ejecutar de forma aleatoria una función en Shell Script
Vamos a ver dos formas de ejecutar funciones elegidas por un script de Bash al azar. En la primera opción, vamos a ver cómo ejecutar una función de un fichero externo, que es lo más útil cuando estamos programando un script complejo con funciones dentro de ese script y quizá funciones guardadas en varios ficheros, por lo que podemos elegir sólo un fichero en el que tengamos las funciones que queramos que se ejecuten de forma aleatoria.
En la segunda opción, utilizaremos las propias funciones del script que estamos ejecutando. Esta opción es más cómoda, pero nos limita mucho más, ya que no podemos hacer funciones que no puedan ejecutarse de forma aleatoria.
Funciones almacenadas en un fichero externo
En Shell Script podemos tener funciones en ficheros externos e invocarlas desde un script. Vamos a crear un fichero con varias funciones de ejemplo al que voy a llamar functions:
function funcion_a(){ echo Estoy ejecutando la función A. } function funcion_b(){ echo Estoy ejecutando la función B. } function funcion_c(){ echo Estoy ejecutando la función C. } function funcion_d(){ echo Estoy ejecutando la función D. }
Y podemos ejecutar una función elegida de forma aleatoria con:
#!/bin/bash . functions fun=$(grep function functions | shuf -n 1 | cut -d " " -f 2 | cut -d "(" -f 1) $fun
Vamos a ver línea por línea qué hace este script.
Primero, invoca con un shebang el intérprete a utilizar, en este caso /bin/bash:
#!/bin/bash
La siguiente línea importa con el operador . el contenido del fichero functions que contiene las funciones:
. functions
La tercera instrucción es más compleja. Vamos a diseccionarla por partes:
fun=$(grep function functions | shuf -n 1 | cut -d " " -f 2 | cut -d "(" -f 1)
En la variable fun vamos a almacenar el resultado de una serie de comandos. No podemos usar function como nombre para una variable, ya que es una palabra reservada del lenguaje, así que elijo el nombre fun.
Con grep function functions
extraigo las líneas que contienen la palabra function del fichero functions:
$ grep function functions function funcion_a(){ function funcion_b(){ function funcion_c(){ function funcion_d(){
Como no quiero todas las funciones sino una elegida al azar, uso shuf para que me devuelva una única línea, de ahí que use el modificador -n 1:
$ grep function functions | shuf -n 1 function funcion_d(){ $ grep function functions | shuf -n 1 function funcion_c(){
Como ya sólo me devuelve una linea al azar que contiene function, necesito limpiar por delante y por detrás el nombre de la función. Primero elimino todo lo previo al primer espacio en blanco:
$ grep function functions | shuf -n 1 | cut -d " " -f 2 funcion_b(){
Y una vez que tengo el nombre de la función seguida de paréntesis, con cut me quedo sólo con la parte previa a la apertura de paréntesis:
$ grep function functions | shuf -n 1 | cut -d " " -f 2 | cut -d "(" -f 1 funcion_c
Y ahora que ya tengo una función elegida al azar, la ejecuto:
$fun
Veamos si el resultado es el esperado:
$ ./script.sh Estoy ejecutando la función D. $ ./script.sh Estoy ejecutando la función A.
Ahora que ya sabemos cómo ejecutar una función elegida aleatoriamente de un fichero, veamos la siguiente opción.
Usar una función elegida aleatoriamente del propio script que se está ejecutando
Como el script que se está ejecutando siempre se llama de forma interna en ese script $0
, en lugar de importar un fichero externo, usaremos esta variable:
#!/bin/bash function funcion_a(){ echo Estoy ejecutando la función A. } function funcion_b(){ echo Estoy ejecutando la función B. } function funcion_c(){ echo Estoy ejecutando la función C. } function funcion_d(){ echo Estoy ejecutando la función D. } fun=$(grep function $0 | shuf -n 1 | cut -d " " -f 2 | cut -d "(" -f 1) $fun
Comprobamos si funciona como estamos esperando:
$ ./randomfunctions.sh Estoy ejecutando la función D. $ ./randomfunctions.sh Estoy ejecutando la función B.
Y, como vemos que funciona, ya sabemos también cómo lanzar funciones seleccionadas al azar de las existentes en el propio script. Una opción más cómoda, también más limitada, de ejecutar funciones sin que sepamos a priori qué va a ocurrir.