Comenzamos con el comando read
Para leer datos desde terminal, más concretamente desde teclado por parte del usuario que está ejecutando el script, utilizaremos el comando read.



Vamos a ir desarrollando una serie de scripts de dificultad progresiva.

Vamos a probarlo 😉

Vamos a utilizar la opción -p de read para mostrar un prompt.


Si tenemos claro el uso que vamos a hacer de la información que nos proporciona el usuario a través de teclado y la vamos a reutilizar más adelante, lo ideal sería guardar esa información en una variable cuyo nombre sea significativo.

Vamos a mostrar información del usuario cuyo nombre nos proporciona el operador a través de teclado.


Insertando el comando while: bucles


Ojo con el comando test y los corchetes. Cuando ponemos una expresión entre corchetes es como si ejecutaramos el comando test.

Los corchetes sirven para facilitar al administrador razonar de forma similar a cómo lo haría en un LPAN (Lenguaje de Programación de Alto Nivel) habitual cómo python o java o C/C++.
Ejercicios
Obteniendo información del fichero de cuentas de usuario para utilizarla más adelante en el script.

Vamos a ver si somos capaces de mostrar esa información en pantalla.

Con esto, tan solo tenemos que utilizar la misma técnica en nuestro script.


El script no falla, es que no tiene permiso el usuario que ejecuta el script, que es alumno, para acceder al directorio personal del usuario marinapg.

Funciones
El problema es que el cuerpo del bucle comienza a ser un poco largo y dificulta razonar a primera vista sobre lo que hace el script.

Que tal si sacamos la funcionalidad principal, la acción que tiene que realizar, en una o más funciones?
Para hacerlo deberíamos analizar qué hace cada parte del código.

Esta sería la función dónde se detalla que se tiene que hacer con la información de usuario insertada por el operador.

El cuerpo del script queda bastante más reducido y comprensible.
La función está bien, aunque utiliza una variable global que puede generar problemas, aunque simplifica mucho el script y la función.
Variables locales
Para crear una variable cuyo ámbito sea el de una función tenemos que utilizar la palabra clave local.

La variable usuario, en todas las líneas es siempre la misma variable, una variable global.

Al utiliza local, estamos creando en la línea 7 una nueva variable propia de la función que es diferente a la variable global usuario aunque tengan el mismo nombre.

Código de retorno de una función
Cómo hemos dicho en varias ocasiones, las funciones en un script son parecidas a un mini script dentro de otro script.También sabemos que los programas y los scripts en bash devuelven un código numérico de retorno que nos indica si se ha ejecutado correctamente o si ha habido algún problema.
Pues con las funciones sucede lo mismo. Cuando ejecutamos una función, ésta devuelve un código de retorno que si no lo devolvemos explicitamente con el comando return, devolverá el código de el último comando ejecutado.
Si queremos terminar de ejecutar una función y devolver un código concreto, un número, podemos utilizar el comando return.

Vamos a probarlo

Vamos a crear una función que obtenga el nombre del usuario y además devuelva cierto (0) si el operador ha insertado algún valor.


Ejercicios
checkConnection.sh
Basándonos en lo que hemos aprendido vamos a crear un script que solicite una dirección IP o un nombre de host al operador. Mientras se proporcione dirección IP el script comprobará si hay conexión con dicha dirección IP.
Si no hay conexión almacenará la dirección IP comprobada en un fichero llamado noConnection.log añadiendo la información al final del fichero. Además de la dirección IP o nombre de host almacenaremos la fecha y hora de la comprobación en el siguiente formato:
- yymmdd;hh:mm:ss
- Por ejemplo: 261028;11:54:23
Ayuda
Utiliza date con las opciones de formato +% para obtener la fecha y hora con el formato solicitado. Puedes consultar toda esta información en la página de manual del comando date.
Utiliza $() para trabajar dentro del script con la salida de un comando.
Solución


userManager.sh
Crea un script llamado userManager.sh que debería ser ejecutado por root. El script solicitará al operador que inserte el nombre de un usuario con el que trabajar, mientras el operador inserte nombres de usuario el script buscará información del usuario proporcionado.
Si el usuario existe en el sistema, mostrará información del usuario: Nombre del usuario, ruta del directorio personal y listado de grupos a los que pertenece el usuario. Ojo! un usuario puede pertenecer a varios grupos como miembro y, además tiene un grupo principal cuyo GID almacena en el fichero /etc/passwd.
Si el usuario no existe, el script preguntará al operador si desea crearlo. Si responde que si, creará una nueva cuenta para el usuario, creándole un directorio personal así como el uso del shell /bin/bash y le configurará como contraseña ClaveRoot#20.
Para hacer este script deberás utilizar la técnica de divide y vencerás o de refinamientos sucesivos. Utiliza funciones!
Ayuda
Estaría bien que hicieras el script por partes.
- Consigue que el script lea nombres de usuario por teclado. Mientras el operador inserte algún nombre de usuario, el script debería continuar realizando una acción (algo simple como mostrar por pantalla un mensaje que indique trabajando) y volver a solicitar información.
- Crea una función que se encargue de realizar la tarea principal del script recibiendo el nombre del usuario por parámetro. Esta función incialmente no tiene porque hacer más que mostrar el nombre del usuario por pantalla.
- Comprueba si el usuario existe o no. Si existe, muestra la información que se solicita. Si no existe, muestra un mensaje que indique que todavía no se ha implementado la solución.
- Realiza la parte del script que se encarga de preguntar al operador si quiere crear una cuenta de usuario nueva y comprobar que se controla que el usuario inserta una S o s para continuar.
- Crear la cuenta de usuario nueva si el operador así lo decide.