educación, informática y demás

24.13 - Repaso general

Vivan los scripts! – Repaso de while, read, funciones y más :)

En esta serie de scripts vamos a trabajar con una estructura que se suele repetir en desarrollo de aplicaciones con lenguajes de programación estructurados en general y en el desarrollo de scripts en particular. Se trata de una estructura de programa que nos permite solicitar información por teclado al usuario y realizar alguna tarea con ella. En este caso concreto, además, vamos a repetir el proceso mientras el operador quiera seguir realizando operaciones.

Con esto tenemos una estructura básica para crear este tipo de funcionalidades en un script cualquiera: solicita información al operador y, mientras se proporcione información, realizamos una tarea con dicha información.

pidemeCosas.sh

Crea un script llamado pidemeCosas.sh que solicite al operador que inserte por teclado algún valor. Mientras el usuario inserte valores, mostramos en pantalla el valor que ha mostrado y volvemos a pedir un nuevo valor.

Solución

La opción más sencilla sería la siguiente

No obstante estamos repitiendo el mismo comando en la línea 5 y en la 9. Podría ser interesante meter este comando así como la comprobación de si el valor de respuesta está vacío o no en una función.

Sin embargo, esta alternativa exige utilizar una variable global. El resultado sería el siguiente

Ya solo este cambio nos facilita el mantenimiento posterior del script.

Vamos a ver cómo podríamos, además, meterlo en el while.

El valor de retorno de la función es un código numérico igual que sucede con los scripts. Este código numérico será un 0 si todo ha ido bien u otro valor si se ha producido un error. Si no utilizamos el comando return, el código de salida de una función será el del último comando ejecutado.

En nuestro caso hemos dejado como último comando el comando test que se encarga de comprobar si el valor introducido por teclado está vacío. Siempre que no esté vacío, sea distinto de «», el comando test retornará un código de salida de éxito. Ese será el código de salida de la función, que utilizamos como condición de salida del while.

Hint o ayuda

Lo que hemos hecho en este script nos puede servir de base para entender cómo podemos crear scripts que soliciten información por teclado al usuario y realicen una acción, bien de forma puntual, una sola vez, bien de forma iterativa, mientras el usuario inserte información por teclado.

Si en lugar del echo hubiéramos utilizado otra serie de comandos o, mejor todavía, una función tan solo tendremos que cambiar la función para que este script realice una u otra tarea.

De esta forma, con esto tenemos una estructura básica para crear este tipo de funcionalidades en un script cualquiera: solicita información al operador y, mientras se proporcione información, realizamos una tarea con dicha información.

consultaUsuario.sh

Solicita por teclado el nombre de un usuario. Mientras el operador inserte un valor, consultamos los datos del usuario. Si el usuario no existe, mostramos un mensaje indicando que el usuario no existe. Si el usuario existe, mostramos información del usuario.

Si el usuario existe, la información que mostraremos será: El nombre del usuario, la ruta de su directorio personal y el resumen de ocupación en disco de su directorio personal en un formato comprensible por humanos. Además, comprobaremos si el usuario está logeado en el sistema actualmente, indicándolo con un mensaje.

Solución

Una posible solución sería la siguiente

Si nos fijamos se parece mucho al script anterior, pero con algunos cambios. Vamos a destacar los cambios

Al final, lo que hemos cambiado es el texto que se muestra al operador, porque ahora solicitamos un dato concreto: el nombre de un usuario. Hemos cambiado el nombre de la función que realiza la acción, dándole un nombre más significativo y acorde a su funcionalidad, es decir un nombre que nos indique que hace esa función.

Por supuesto, hemos cambiado o creado el cuerpo de la función de acuerdo a lo que queremos que haga. Pero la estructura, es la misma.

Vamos a probar el script

consultaHost.sh

El script solicita por teclado el nombre de un host o una dirección IP de host. Mientras el operador inserte un valor, consultamos información sobre dicho host.

Lo primero que haremos será comprobar si tenemos conexión con dicho host, indicando si tenemos o no conexión con él.

Después, comprobaremos si el host o la dirección IP está en el fichero de resolución estática de nombres del sistema: /etc/hosts.

Por último, comprobaremos si hay resolución de nombres DNS sobre el host o dirección IP proporcionada. Si es así, mostraremos la información. Si no es así, mostraremos un mensaje indicando que no hay resolución de nombres para ese host o para esa IP.

Solución propuesta

El esquema a utilizar sería el siguiente

Ahora solo queda dotar de funcionalidad a la función consultaHost:

  1. Comprobar si hay conexión. Comando ping.
  2. Comprobar si está en el fichero /etc/hosts. Comando grep.
  3. Comprobar si hay resolución de nombres. Comando nslookup.

Si los comandos, con los parámetros adecuados, funcionan significará que hay conexión, está definido en el fichero de hosts o tiene resolución de nombres.

Vamos a probar

consultaFichero.sh

El script solicita por teclado la ruta de un fichero. Mientras el operador inserte un valor, consultamos información sobre dicho fichero.

Lo primero que haremos será comprobar si existe el fichero. Si el fichero no existe, indicamos la situación con un mensaje adecuado y continuamos sin hacer nada más con el siguiente fichero cuya ruta inserte el operador por teclado.

Si el fichero existe y es un directorio, mostraremos información extendida del fichero en formato comprensible por humano del continente, del directorio, no del contenido. Además, mostraremos el resumen de ocupación del directorio en formato comprensible por humanos

Sino es un directorio y es un fichero estándar o normal, mostraremos información de extendida del fichero en formato comprensible por humanos y además, mostraremos si el operador tiene permisos de lectura, escritura y ejecución sobre el fichero. Para ello, mostraremos un mensaje específico para cada tipo de permiso sobre el fichero.

Por último, comprobaremos si es un fichero de texto plano con el comando file. Si es de texto plano, mostraremos su contenido en pantalla.

Si tampoco es un fichero estándar y es un enlace, entonces además de mostrar la información para el fichero, mostraremos un mensaje indicando que el fichero es un enlace.

Si tampoco es un enlace, entonces mostraremos un mensaje indicando que se trata de un fichero especial.

Solución propuesta

Partimos del esquema base, en el que cambiamos el mensaje a mostrar al operador y la función que utilizaremos para implementar la funcionalidad a realizar con cada ruta de fichero.

En este caso he introducido un pequeño cambio con respecto a los anteriores. Ahora le paso por parámetro el valor de la respuesta a la función consultaFichero. Nos da un poco igual, porque respuesta es una variable global, pero así trabajamos de una forma más acorde a la forma de trabajar en programación estructurada.

Podríamos utilizar una aproximación similar a la de la imagen. Ahora realizaríamos el resto de comprobaciones. No obstante, si nos fijamos todas las comprobaciones son mutuamente excluyentes y encadenadas, así que… lo ideal sería utilizar una construcción de tipo if…elif…else

Ahora deberíamos implementar la funcionalidad de cada uno de las ramas del if..elif..else

Dejar una respuesta