educación, informática y demás

24.13 - Repaso general

Obteniendo datos en tiempo de ejecución

Una de las grandes ventajas que tienen los scripts es que podemos especializar su función en el momento de ejecutarlos. Es decir, cuando ejecutamos un script éste puede obtener cierta información, bien del operador o bien del sistema, que hará que el script realice su tarea de manera más especializada.

Por ejemplo, un script que permita crear un usuario y todos los recursos necesarios para que ese usuario trabaje en nuestro sistema tan solo conociendo el nombre del usuario que queremos crear. El script es el mismo, el código fuente, sin embargo realizará una función u otra en base al nombre de usuario que le proporcionemos en el momento de ejecutarlo.

Tiempo de ejecución y tiempo de edición (compilación)

Cuando creamos un programa o en este caso un script, se define tiempo de edición o compilación el momento en el que estamos escribiendo el código del script. En ese momento, nosotros creamos un programa que implementa un algoritmo para realizar alguna función compleja, solucionar un problema, etc.

Habrá muchas ocasiones en las que en el momento de crear un script no conocemos los valores concretos con los que trabajará el script. Por ejemplo, el ejemplo anterior del script nuevoEmpleado.sh. En el momento de editar el script no sabemos exactamente cuál será el nombre del nuevo empleado, pero si sabemos que necesitamos un nombre de nuevo empleado o usuario para trabajar con él.

Tiempo de ejecución se define como el tiempo que va desde que se ejecuta el script hasta que termina su ejecución.

Pues bien, una de las grandes ventajas de los scripts, que ya hemos comentado, es precisamente esta la de poder obtener valores concretos para datos con los que trabajará justo en el momento de ejecutarlos, es decir en tiempo de ejecución.

Datos: Variables

En tiempo de edición no conocemos el valor que tendrá un dato, pero si sabemos que necesitamos ese dato y le podemos dar un nombre. Justo aquí vienen las variables.

Una variable es un dato que tiene un identificador o nombre que nos permite identificarlo y que almacena un valor que es variable. Que el valor sea variable significa que puede cambiar a lo largo de la ejecución del script o no y que puede cambiar de una ejecución del script a otra.

Ejemplos de variables en script

Vamos a utilizar un script de ejemplo que llamaremos nuevoEmpleado.sh.

Este script realizará una función u otra en base al valor almacenado en la variable usuario. En realidad, ahora mismo, realiza la misma función que es mostrar un mensaje en pantalla, pero el mensaje será distinto dependiendo del valor almacenado en la variable usuario.

Si queremos cambiar la funcionalidad tenemos que editar el fichero y modificar, al menos, el valor asignado a la variable.

En este caso, el script obtiene la información de la variable usuario, pero esta variable la estamos cambiando en tiempo de edición o compilación. Es decir, tenemos que editar el fichero del script y cambiar el valor asignado a la variable para cambiar o especializar la función del script.

Cómo obtener datos en tiempo de ejecución

Hemos visto cómo podemos especializar la tarea que realiza un script tan solo usando variables, pero lo ideal sería que pudiéramos asignar valores a las variables con las que tenemos que trabajar en nuestro script en tiempo de ejecución. Para ello tenemos varias alternativas que vamos a enumerar a continuación.

  • Parámetros. Podemos pasarle al script justo en el momento de ejecutarlo valores por parámetro al igual que hacemos con comandos o aplicaciones que ejecutamos desde la terminal.
  • Entrada a través de teclado. Desde el script podemos ejecutar un comando, el comando read, que nos permitirá solicitar al operador que inserte cierta información desde teclado.
  • Leer datos de ficheros. Desde un script podemos acceder al contenido de ficheros y leerlos para obtener información. La ruta de estos ficheros puede ser una ruta que conozcamos previamente, por ejemplo cuando leemos datos del fichero de cuentas de usuario del sistema, o puede ser proporcionada por parámetro.
  • Obtener información de la ejecución de algún comando. Gracias al uso de la herramienta $(CMD) podemos obtener la salida de un comando y utilizarla dentro de nuestro script, bien asignándola a una variable, bien usándola directamente con otro comando o bien recorriendo toda la información a través de un bucle

Obteniendo datos por parámetro

Para obtener datos por parámetro podemos utilizar las variables especiales $1..$9 o $@. Es más, podríamos utilizar un bucle for para recorrer una lista variable de parámetros dónde se proporcionen más de nueve parámetros.

Ejercicio – Solo un parámetro.

Modifica el script nuevoEmpleado.sh para que obtenga el nombre del usuario a través del primer parámetro recibido por el script.

Solución

Veamos la funcionalidad del script en tiempo de ejecución.

Dependiendo del valor pasado en el primer parámetro el script especializa su funcionalidad.

Ejercicio – Varios parámetros

Modifica el script para que reciba en el primer parámetro el nombre del usuario, pero que además muestre el valor pasado en los parámetros del 1 al 9 y el número de parámetros pasados al script.

Solución

El detalle en este ejemplo es que utilizamos tan solo el primer parámetro, al que asignamos a una variable con un nombre significativo para facilitar la legibilidad del código, para realizar la función principal del script.

El resto de parámetros los estamos mostrando por que nos lo piden, pero no los usaremos realmente. Es decir, en un script puede que nos pasen n-parámetros y nosotros utilizaremos el valor de los parámetros que nos interese o que queramos.

Aunque le hayamos pasado cuatro parámetros, el script realmente trabajará con el primero realizando su función. Nosotros estamos mostrando todos para que podemos comprobar que el script puede acceder a ellos si quiere, pero si nos ceñimos a la funcionalidad básica del script tan solo utilizamos el primero.

Otro detalle importante es el hecho de asignar los parámetros a variables con nombres significativos.

Ejercicio – Dos parámetros

Modifica el script para que reciba en el primer parámetro el nombre del usuario y en el segudo parámetro el nombre de un grupo. Además mostrará en pantalla el valor pasado en los parámetros del 1 al 9 y el número de parámetros pasados al script.

Solución

No tenemos porque utilizar todos los parámetros que nos pasen. En este caso, solo utilizaremos para la funcionalidad del script los dos primeros parámetros. Importante: Siempre asignamos los valores de los parámetros con los que vayamos a trabajar a variables que tengan un nombre significativo.

Detalles a tener en cuenta:

  • Solo utilizamos para la funcionalidad los dos primeros parámetros.
  • Utilizando variables del $1 al $9 solo podemos mostrar los nueve primeros parámetros.
  • Se han pasado 15 parámetros al script, pero solo podemos referenciar los nueve primeros utilizando $numero.

Si quiero acceder al valor de todos los parámetros recibidos tendría que utilizar o bien $@, que es una variable que contiene todos los parámetros como una cadena de texto o bien un bucle for que recorra los parámetros ($@)

Ejercicio – Todos los parámetros por igual

Modifica el script para que reciba una lista variable de parámetros, suponemos en este ejemplo que todos los parámetros son nombres de usuarios. El script realizará la acción con cada uno de los parámetros pasados y, por último, mostrará el número de parámetros pasados al script.

Solución

Como nos han indicado en la solución del ejercicio anterior, tendremos que utilizar un bucle for porque nos dicen que el script realizará la acción con cada uno de los parámetros. Vamos a echar un vistazo a la ayuda del comando for.

Si no utilizamos la parte in PALABRAS, el bucle for recorrerá los parámetros pasados al script (o a la función si el bucle está dentro de una función).

El bucle for recorrerá la lista de parámetros pasados al script, que está almacenada en la variable $@. De esta forma, en cada vuelta del bucle for la variable usuario, que tiene un nombre significativo, irá guardando cada uno de los parámetros pasados al script.

Veamos su funcionamiento…

Hemos recorrido los 15 parámetros realizando la acción para cada uno de ellos.

Ejercicio – Un parámetro y el resto de parámetros

Modifica el script para que reciba por parámetro el nombre de un usuario y una lista variable de grupos.

El script primero mostrará el número total de parámetros. Después realizará la acción con el usuario, que consiste en mostrar información por pantalla. A continuación, mostrará, uno a uno, la lista de grupos a los que debería pertenecer el usuario. Para finalizar, mostrará el número de grupos pasados al script.

Solución

Vamos a utilizar el comando shift

Para que veamos cómo funciona hemos añadido dos líneas dónde se muestran todos los parámetros antes y después de ejecutar shift

Si nos fijamos, después de ejecutar shift, el primer parámetro se pierde y el segundo parámetro pasa a ser el parámetro número 1, y así sucesivamente.

Ejercicio – Dos parámetros y lista variable de parámetros

Modifica el script de forma que ahora reciba en el primer parámetro el nombre de un usuario, en el segundo el nombre de un grupo y a continuación una lista variable de nombres de directorios.

La acción del script consistirá en crear el usuario, añadir el usuario al grupo y crear cada uno de los directorios cuyo nombre se ha pasado por parámetro dentro del directorio personal del usuario.

No realices ninguna acción, tan solo muestra un mensaje con echo de lo que deberías realizar.

Solución

Vamos a ver cómo funciona

Práctica final

Vamos a implementar el último script que hemos creado, es decir vamos a añadir los comandos necesarios para qué el script realice realmente su función.

  • Creará la cuenta de usuario en el sistema solo si no existe.
  • Si no existe el grupo, lo creará previamente.
  • Añadirá la cuenta de usuario al grupo
  • Creará cada uno de los directorios en el directorio personal del usuario y lo configurará para que el usuario pueda realizar cualquier operación sobre dicho directorio.

Lo ideal es que, además de realizar la función que tiene que realizar el script, se realice control de errores:

  • El script debe ser ejecutado por root
  • Debe recibir al menos dos parámetros

Dejar una respuesta