educación, informática y demás

GNU/Linux bash, Shell scripts

Scripts sencillos

Vamos a crear una serie de shell scripts de bash sencillos para practicar con los fundamentos de programación estructurada.

pideDatos.sh

Este script deberá solicitar al usuario el nombre de un usuario y de un grupo.

Con la información obtenida mostrará un mensaje en pantalla con el nombre del usuario y del grupo insertado.

Lenguaje natural

  1. Pedir al usuario que inserte el nombre del usuario.
  2. Pedir al usuario que inserte el nombre del grupo.
  3. Mostrar el nombre del usuario
  4. Mostrar el nombre del grupo

Solución

Para pedir información por teclado a un usuario/operador usamos el comando read. Para mostrar cadenas de texto en pantalla usamos el comando echo.

Hay que utilizar un prompt para dar información al usuario sobre qué datos se espera que inserte.

Versión 2 – Obteniendo los datos por parámetro

Modifica tu script para que ahora obtenga los datos usuario y grupo por parámetro, en lugar de obtener la información solicitándola al operador y que este la inserte por teclado.

En el primer parámetro se espera el nombre del usuario y en el segundo el nombre del grupo.

Después de obtener esta información, se continuará llevando a cabo la misma función: mostrar información en pantalla.

Solución

Lo único que tenemos que cambiar es la parte del script que se encarga de obtener información del operador.

Ahora vamos a tomar la información de los datos pasados por parámetro al script. En concreto el parámetro 1 y el 2.

Vamos a probarlo…

¿Qué pasará si le pasamos más parámetros de los que utilizamos en el código del script?

No se van a usar.. está claro que si no los usamos dentro del script, simplemente no se utilizarán para nada.

Los parámetros 3 y 4, representados en el script por $3 y $4 no se utilizan para nada por eso no cambia la salida.

¿Qué pasará si no le paso algún parámetro?

En estos casos la variable que almacena el parámetro estará vacía y por tanto la variable que hemos creado nosotros para darle nombre al parámetro o almacenarlo también lo estará.

En este script no pasa nada, porque tan solo estamos mostrando cadenas de texto por pantalla, pero esta situación podría provocar errores graves si no se controla en otro tipo de scripts.

Versión 3 – Muestra información del usuario y del grupo

Con la ayuda del comando grep, muestra la línea de configuración del usuario pasado por parámetro y del grupo pasado por parámetro.

  • Comandos: grep y echo.
  • Ficheros: /etc/passwd y /etc/group

Lenguaje natural

  1. Obtener el nombre del usuario por parámetro.
  2. Obtener el nombre del grupo por parámetro.
  3. Mostrar la línea del fichero /etc/passwd dónde aparece el nombre del usuario en el primer campo, es decir al inicio de la línea-
  4. Mostrar la línea del fichero /etc/group dónde aparece el nombre del grupo en el primer campo, es decir al inicio de la línea.

Ahora deberíamos ser capaces de hacer esto con comandos.

Solución

La primera parte es fácil, ya la tenemos hecha…

¿Sabemos mostrar las líneas del fichero /etc/passwd dónde aparece el nombre del usuario?

Vale, ¿pero cómo conseguimos que solo seleccione las líneas en las que aparece la cadena de texto o patrón solo al principio de las mismas?.

Vamos a consultar la ayuda de grep.

Estos caracteres especiales, ^ y $, sirven para indicar que delante del patrón de texto, con ^, o detrás, con el $, no debe aparecer nada más (cadena vacía). Es decir, que el patrón esté al principio de la línea o al final de la línea.

Ejemplos:

  • grep ^marinapg /etc/passwd # El patrón marinapg debe estar al inicio de la línea para que la seleccione.
  • grep marinapg$ /etc/passwd # El patrón marinapg debe estara al final de la línea para que la seleccione,

Vamos a probarlo.

Pero esto no es del todo correcto……. Vamos a probar a pasarle al como nombre de usuario y e como nombre de grupo.

No hace lo que esperamos porque grep busca cualquier ocurrencia de la cadena de texto «al» al inicio de la línea. Esto sucede con el usuario alumno y con alfredoff. Lo mismo sucede con el grupo, se busca la cadena de texto «e», que se encuentra en el grupo educatica y evaha

Por ejemplo si tuviéramos el usuario ana y el usuario anabel, pasando el nombre de usuario ana, nos mostraría información de los dos usuario.

Nosotros queremos que muestre el nombre de ese usuario, es decir aquellas líneas en las que aparezca el patrón completo.

Para ello tenemos que usar la opción de grep -w

Con esta opción, indicamos a grep que seleccione las líneas que contengan la palabra completa.

copiaSeguridad.sh

Vamos a escribir un script que reciba como parámetro el nombre de un usuario. El script copiará el directorio personal del usuario dentro del directorio /backup.

Si el directorio /backup no existe, lo creamos. Como no sabemos, por ahora, utilizar condicionales vamos a crearlo siempre que se ejecute el script.

A continuación, copiamos el directorio personal del usuario y todo su contenido dentro del directorio /backup.

En esta versión supondremos que el directorio personal del usuario está en /home con el mismo nombre que el usuario.

Lenguaje natural

  1. Obtener el nombre del usuario de parámetro.
  2. Determinar la ruta de su directorio personal.
  3. Crear el directorio /backup (TODO: Si no existe el directorio /backup, entonces creamos el directorio /backup)
  4. Copiar el directorio personal del usuario y todo su contenido en /backup con el mismo nombre que el usuario.
  • Comandos: mkdir y cp

Solución propuesta

Vamos a probarlo

Ha funcionado perfectamente o eso parece.. Vamos a echar un vistazo al directorio /backup para ver si se ha copiado.

El comando cp ha establecido como propietario y grupo de los nuevos ficheros creados al usuario que ha realizado la copia y su grupo primario. Esto, cuando es una copia de seguridad, deberíamos evitarlo, manteniendo los permisos de los ficheros originales.

Podríamos cambiar propietario y grupo a posteriori, pero no podemos estar al 100 % seguros de que todos los ficheros del directorio personal tuvieran como propietario y grupo al usuario original.

Además, para este tipo de problemas, existe una opción del comando cp que permite mantener la configuración de permisos, propietario y grupo en una copia.

Vamos a cambiar la -R por -a.

Versión 2 – Copias de seguridad organizadas por usuario y tiempo

Vamos a guardar las copias de seguridad de los directorios personales de los usuarios organizadas en directorios con el nombre de cada usuario. Dentro del directorio del usuario, podremos tener distintas versiones de su directorio personal.

Cada versión se almacenará en un directorio cuyo nombre será: yymmdd-hhMM, dónde:

  • yy. Año en que se creó con dos cifras
  • mm. Mes en que se creó con dos cifras.
  • dd. Día en que se creó con dos cifras
  • hh. Hora en que se creó con dos cifras
  • MM. Minuto en que se creó con dos cifras

Tendremos que obtener esta información del sistema para poderla utilizar en la ruta del directorio destino de la copia de seguridad.

Lenguaje natural

  1. Obtener el nombre del usuario de parámetro.
  2. Determinar la ruta de su directorio personal.
  3. Determinar la ruta del directorio destino, teniendo en cuenta la fecha y hora actuales.
  4. Crear el directorio destino
  5. Copiar el directorio personal del usuario y todo su contenido en el directorio destino.

Solución propuesta

nuevoComentario.sh

Vamos a crear un script que permita añadir comentarios a un fichero de comentarios. El fichero de comentarios debería estar en el directorio personal del usuario actual con el nombre comments.log.

El script recibirá por parámetro una cadena de texto compuesta por todos los parámetros pasados.

Añadirá al fichero de comentarios la fecha y hora actual con un formato dado, seguido por el comentario recibido separado por el carácter «:».

El formato de la fecha y hora será: yy/mm/dd:HH-MM-SS

De esta forma, cada línea del fichero contendrá un comentario con el siguiente formato:

yy/mm/dd:HH-MM-SS:Comentario

  • Comandos: echo
  • Especiales: $@ o $* y redirecciones.

Lenguaje natural

  1. Obtenemos la fecha y hora en el formato que se pide.
  2. Mostramos en pantalla la información en el formato solicitado y redirigimos la salida al fichero.

Solución propuesta

  1. Juan Carlos

    Me encanta

Dejar una respuesta