educación, informática y demás

26.03 - Automatizacion I

Obteniendo información en nuestro script

Podemos crear un script que tan solo se limite a ejecutar una serie de comandos de forma estática. Esta solución es correcta para algunos casos y, cómo mínimo, nos permitirá automatizar una serie de tareas que tenemos que realizar de forma periódica y que nos llevaría un rato, por ejemplo, escribir uno tras otro todos los comandos en secuencia.

Por ejemplo, si queremos realizar una vez al mes una actualización del sistema, además de copia de seguridad de ficheros de configuración del sistema y servicios importantes y además queremos hacer un chequeo de los sistemas de ficheros y además…..

Si tratamos de ejecutar uno tras otro los comandos, aunque sean estáticos no cambian, siempre son los mismos, es un rollo por dos motivos:

  1. Los tengo que escribir una y otra vez :_(
  2. Tengo que esperar a que termine de ejecutarse un comando para interactuar con el sistema y escribir el siguiente.

Solución: un script 🙂

Pero en la mayoría de los casos, podemos reutilizar un script para realizar una función concreta que se adapte a cierta información que le demos en el momento de ejecutarse. Es decir, lo ideal es que podamos proporcionar información al script en tiempo de ejecución que permita que nuestro script haga una función más específica.

Variables y valores literales

Un valor literal en un script o en un programa en cualquier lenguaje de programación es un valor que se escribe directamente tal cuál en el código del programa.

El nombre del usuario es marinapg, este dato lo hemos escrito como un valor literal. Si quisieramos cambiar la función del script para que mostrara información del usuario alfredoff, tendríamos que cambiar todos los valores literales de marinapg por alfredoff.

Cuando estemos en esta situación, que utilicemos un valor literal en varias líneas de código tendríamos que utilizar una variable. De esta forma, tan solo cambiando el contenido de la variable, en la asignación la función del script sería distinta.

Tiempo de edición vs Tiempo de ejecución

La solución de las variables es muy buena, pero implica que cada vez que queramos cambiar la función de nuestro script tenemos que editarlo. Este momento en el que nosotros editamos el fichero y lo cambiamos se llama tiempo de edición o, en LPAN (Lenguajes de Programación de Alto Nivel) se llama tiempo de compilación.

A nosotros nos interesaría poder ejecutar el script y en el momento en el que se ejecuta poderle indicar de alguna manera con qué usuario queremos trabajar. A esto se le llama proporcionar información en tiempo de ejecución, es decir cuando se ejecuta el script.

Tenemso varias formas de proporcionar información de entrada en tiempo de ejecución a un script:

  1. Parámetros.
  2. Leyendo de teclado / terminal.
  3. Ejecución de comandos en tiempo de ejecución (?)
  4. Ficheros
  5. Tuberías

Parámetros

Variables de parámetro

Crea un script llamado params01.sh que muestre en pantalla el nombre del script y los nueve primeros parámetros pasados a un script.

Si quieres puedes mirar el apartado de parámetros que está dentro del apartado de Bash Shell Script en www.educatica.es.

Vale, vamos a probarlo.

Cuantos parámetros habrá ahora?

Estamos mostrando parámetros que están vacíos y además…. qué pasará si pasamos más de nueve parámetros?

OH!

Recorriendo parámetros 🙂

Crea un script llamado params02.sh que muestre en pantalla el nombre del script y todos los parámetros que se han pasado al script uno tras otro. Si solo se pasan dos parámetros, mostrará solo dos.

Pistas

Los bucles son tus amigos

Si no sabes algo, pregunta: consulta la ayuda o la página de manual del comando que quieras utilizar (help o man)

Tenemos claro que tenemos que utilizar un bucle, pero no sabemos cual. Queremos recorrer una lista de elementos: la lista de parámetros. ¿Qué bucle está especialmente indicado para recorrer una lista de elementos? El bucle for.

Si no sabemos cómo usar el bucle for, consultamos su ayuda.

Si no te acuerdas bien de cómo funcionan los bucles for en bash puedes consultar el subapartado dedicado a bucles for en el apartado de bash shell script en www.educatica.es.

Vamos a probarlo

Nombrando los parámetros: uno a uno

Crea un script llamado params03.sh que reciba por parámetro el nombre de un usuario, el nombre de un grupo y la ruta de un directorio.

El script mostrará en pantalla la información proporcionada. Después mostrará información sobre el usuario, información sobre el grupo y mostrará el contenido del directorio cuya ruta se ha proporcionado.

Nombres significativo! Si el script es largo, de más de un comando, y aún así, deberíamos utilizar variables para asignarles el valor de los parámetro y utilizar variables con nombres significativos.

Por supuesto este script tiene problemas, habría que hacer control de errores, pero ahora mismo estamos repasando desde el principio.

Listas variables de parámetros

Habrá veces en las que nos pasen cero, uno o varios parámetros, tendremos que saber recorrer los parámetros y realizar las acciones que nos piden.

Crea un script llamado params04.sh que reciba por parámetro una lista variable de nombres de usuario. El script mostrará para cada usuario el nombre del usuario seguido de parte de la información almacenada en el fichero de cuentas de usuario para ese usuario. En concreto mostrará el UID y la ruta del directorio personal del usuario.

Eldesarrollo lo podemos realizar paso a paso

Con esto tenemos claro que somos capaces de recorrer los parámetros de la lista de parámetros variable que me están pasando.

Parámetros y listas variables de parámetros

Habrá ocasiones en las que recibamos uno o dos parámetros obligatorios y después una lista de parámetros opcional. Para poder recorrerlos podemos utilizar el comando shift.

Crea un script llamado params05.sh que reciba por parámetro el nombre de un grupo seguido de una lista variable de nombres de usuario con al menos un usuario. El script mostrará el nombre del grupo y recorrerá los usuarios de la lista variable de usuarios añadiendo el usuario en el grupo proporcionado.

No hace falta realizar control de errores por ahora.

Veamos cómo funciona