educatica!

educación, informática y demás

GNU/Linux bash, Shell scripts

Bash shell script 01

Vamos a crear un primer script llamado helloWorld.sh. Para ello vamos a user el editor de textos mousepad.

Lo vamos a lanzar pasandole por parámetro la ruta del fichero que queremos editar, además lo lanzaremos con & para que la shell cree un nuevo proceso en el que ejecutar esta aplicación.

La primera línea de nuestros script para bash debería ser la siguiente:

La #! indica a la shell bash que la ruta que se escribe a continuación es la del programa que se utilizará para ejecutar el script. Es decir, cuando ejecutemos este script, bash va a ejecutar /bin/bash para que ejecute cada uno de los comandos que componen el script.

Los comentarios en la shell bash se crean utilizando el caracter #. Todo lo que se escribe detrás de una # es un comentario que no será ejecutado por bash.

Vamos a poner los comentarios títpicos que utilizamos de base en los scripts con una pequeña descripción, autor y fecha de creación o modificación del script. Por último añadimos los comandos que queremos ejecutar. En este caso solo uno: un echo para mostrar un mensaje.

Como podemos observar no tiene resaltado de sintaxis. Esto es así porque no le hemos indicado el tipo de lenguaje de programación que estamos usando y no lo ha sacado de la extensión del fichero porque todavía no hemos guardado. Si guardamos, debería aplicarnos el resaltado de sintaxis.

La única línea que contiene toda la funcionalidad del script es la línea 7

¿Cómo se ejecuta un script?

Para ejecutar un script lo primero que deberíamos hacer es darle permiso de ejecución.

Vamos a dar permiso de ejecución a todo el mundo. Todos los usuarios, según los permisos establecidos puede leer, así que vamos a darles también el de ejecución. Cuidado, no vamos a usar los permisos en octal, usaremos el modo simbólico.

Ya podemos ejecutar el script, ahora solo hace falta indicar a la shell que lo ejecute. Para ello tenemos que escribir la ruta del fichero ejecutable. Si escribimos el nombre del fichero, no se va a ejecutar.

Esto sucede porque bash busca primero en memoria, por su helloWorld.sh fuera un comando interno. Después, si no lo encuentra, busca en cada uno de los directorios almacenados en la lista de directorios de la variable PATH. Si no lo encuentra, deja de buscar y muestra un mensaje de error.

Para indicar que el ejecutable está en el directorio actual tenemos que usar ./ seguido del nombre del fichero.

No podemos utilizar .helloWorld.sh porque hay en GNU/Linux hay ficheros que comienzan por . por tanto bash va a buscar un fichero llamado .helloWorld.sh, que no existe.

Por tanto, en resumen:

  1. Podemos crear un script con cualquier editor de texto, tan solo tenemos que guardarlo en un fichero.
  2. Para poder ejecutarlo, tenemos que darle permiso de ejecución
  3. Para ejecutarlo tan solo tenemos que escribir la ruta del fichero.

De aquí en adelante, nosotros vamos a usar gedit como editor de texto, aunque podríamos seguir con mousepad o utilizar el editor que más nos guste, como nano.

Script informacion.sh

Crea un script llamado informacion.sh que muestre en pantalla cierta información. La información que deberá mostrar es:

  1. La hora actual, con una etiqueta que indique «Hora actual: «
  2. La fecha actual, con una etiqueta que indique «Fecha actual: «
  3. El nombre del usuario actual
  4. La ruta del directorio personal del usuario actual
  5. La ruta del directorio actual

¿Sabes hacer esto con comandos?. Si la respuesta es que si, entonces sabes hacer un script que haga todas estas funciones aprovechando la secuencialidad.

  1. Muestra una cadena de texto en pantalla: «la hora actual es»

2. Muestra la hora actual. Comando date.

Vamos a hacer la primera versión de nuestro script. Para ello lanzaremos gedit con la ruta del fichero a editar, informacion.sh, seguido de un caracter & para que se lance en un nuevo proceso.

La primera línea indica a la shell bash qué programa se debe utilizar para ejecutar este script.

Ahora vamos a añadir los comentarios de cabecera habituales.

En GNU/Linux bash los comentarios se definen utilizando el caracter #. Todo lo que se escribe detrás no será ejecutado por la shell, salvo si es #! en la primera línea, que indica la ruta del programa que interpreterá el script

Ahora escribimos los comandos que queramos ejecutar en el orden en que queramos que sean ejecutados.

Ya hemos ejecutado estos comandos independientemente, ahora solo falta ejecutarlos dentro del script.

Le damos permiso de ejecución al script y lo ejecutamos

Ahora lo ejecutamos escribiendo la ruta del fichero ejecutable. /bin/bash, que es nuestra shell va a leer la primera l´ínea del script y se va a encontrar con #!/bin/bash, que es la ruta del programa interprete que se debe ejecutar para ejecutar este script.

Vamos a solucionar el salto de línea de echo, para ello consultamos la ayuda del comando y utilizamos la opción -n.

Ahora, cuando echo muestre el mensaje no imprimirá un salto de línea, con lo que la salida del comando date aparecerá justo detrás del último caracter impreso por echo.

Vamos a mostrar la fecha actual. Para ello consultamos la ayuda del comando date y buscamos la opción de formato que muestre solo la fecha.

Vamos a usar variables para mostrar el resto de información que nos solicitan. Para ello vamos a consultar las variables de entorno con el comando env sin parámetros.

Vamos a usar estas variables con comandos echo

Vamos a comprobar su funcionamiento ejecutándolo.

¿Podríamos guardar la salida del script en un fichero llamado informacion.log?

showUser.sh

Crea un script llamado showUser.sh que muestre la línea de configuración de la cuenta de usuario marinapg en pantalla.

¿Sabemos mostrar con un comando la línea de configuración del usuario marinapg?

Funciona pero vamos a perfilarlo…

Ahora vamos a terminar de perfilar, queremos que busque la palabra completa marinagp, para ello usamos la opción -w.

Vamos a crear un script con ese comando aprovechando las redirecciones.

El fichero solo tiene ese comando, ahora vamos a perfilarlo…

Vamos a probarlo.

Si ahora nos piden que en lugar de marinapg mostremos información de alfredoff, tendriamos que cambiar el comando

¿Y si después nos piden que consultemos a ramonam?.

¿Y si utilizamos una variable? La variable usuario que contendrá el nombre del usuario para el que queremos mostrar informacion.

Vamos a darle una vueltita al script… no queremos la línea, queremos que se muestre, en líneas distintas, el nombre del usuario, su UID, su GID, su directorio personal y su shell.

¿Sabemos mostrar en pantalla solo el UID del usuario? Tendremos que utilizar tuberías con grep y cut.

Sabemos como mostralo, ahora solo tenemos que usar estos comandos en nuestro script.

Si queremos consultar otro usuario tenemos que editar el fichero y cambiar el valor de la variable.

¿Y si usaramos parámetros?

showGroup.sh

Crea un script llamado showGroup. sh que muestre los miembros de un grupo cuyo nombre se pasa por parámetro.

Como sabemos la información de cuentas de grupo se guarda en el fichero /etc/group. En cada línea del fichero se guarda información de un grupo difente. El primer campo es el nombre del grupo y el delimitador es el caracter :

Primero vamos a mostrar la línea que me interesa, por ejemplo usaremos el grupo logistica.

Ahora utilizando tuberías y comando cut nos vamos a quedar con el campo que nos interesa, que será el cuarto campo: los miembros del grupo.

Ya tenemos casi hecho el script, solo nos queda escribirlo en el fichero y tomar el nombre del grupo del primer parámetro.

Si queremos formatear la salida con etiquetas podemos escribir el siguiente scipt.

Si no le pasamos valor por par´ámetro, la variable grupo estará vacía y el resultado será el siguiente

Habrá scripts en los que tengamos que controlar si se pasa o no valores por parámetro o si existe o no el valor que se ha pasado, en este caso el grupo para el que queremos consultar información.

Deja un comentario

Tema creado por Anders Norén