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.

 

 

 

 

 

Deja una respuesta

Tu dirección de correo electrónico no será publicada.