En este script vamos a aprovechar los comandos que estuvimos utilizando en el primer ejemplo de la entrada sobre variables en GNU/Linux.
¿Qué es un script?
Si quieres saber más sobre los scripts tan solo tienes que visitar la página sobre shell scripts en www.educatica.es.
Básicamente, un shell script es un programa creado con comandos de GNU/Linux bash almacenado en un fichero de texto plano.
Los comandos de dicho fichero se ejecutarán en secuencia en el orden en el que aparecen en el fichero.
Creando nuestro script
Si un script se almacena en un fichero de texto plano, para crearlo deberíamos utilizar un editor de texto. Podemos utilizar tanto nano, que es un editor de texto en modo texto, como gedit o mousepad, que es el incluido en GNU/Linux xubuntu 22.04 que estamos usando actualmente.
Algunos detalles… al ejecutar el mousepad y pasarle el nombre del fichero, la aplicación trata de cargarlo. Como no existe, le asigna como nombre de fichero la ruta del fichero que hemos pasado por parámetro. Como no hemos guardado, este fichero está modificado para la aplicación.
Otro detalle… la shell está «bloqueada». Es como si estuviera ejecutan mousepad en modo monotarea. Hasta que no termine mousepad no volverá a respondernos. Para evitarlo, podemos lanzar mousepad en segundo plano utilizando un & al final de la linea del comando que ejecuta la aplicación a lanzar en segundo plano.
Primera parte del script
Esa primera línea comienza por una #. La # es el carácter especial que indica que lo que viene a continuación es un comentario. Los comentarios no se ejecutan por la shell.
La combinación #! indica a la shell que para ejecutar este script se debe utilizar el interprete de comandos cuya ruta se escribe a continuación sin espacios.
Por tanto, en esa primera línea, indicamos que esto es un script y que para ejecutarse se utilizará /bin/bash.
Ahora, vamos a aprovechar todo lo que ya hemos escrito en la terminal.
Esta sería la primera versión a lo bruto.
Vamos a refinarlo un poco…
sudo go home!
En un script si se debe ejecutar algún comando como administrador, no se pone el sudo dentro del script. Se ejecuta el script como superusuario.
sudo ./addEmpleado.sh
Condicionales… ¿qué son?
Ahora mismo no sabemos qué es una sentencia condicional, o no sabemos como aplicarla en un script de la shell bash.
Nos faltaría poder decirle a la shell que: «Si no existe el usuario $usuario entonces crea el usuario $usuario» Pero no sabemos como hacerlo…
La solución más simple, mientras aprendemos, sería intentar crearlo siempre. Si el usuario ya existe, el propio comando adduser indicará que ya existe el usuario.
¿Cómo se ejecuta el script?
Para poder ejecutar un script en la shell bash lo primero que tenemos que hacer es darle permiso de ejecución.
Para que pueda ser ejecutado debemos proporcionar permiso de ejecución a quienes nosotros queramos que pueda ejecutar el script, por ejemplo supongamos que solo queremos poder ejecutarlo nosotros.
Lo más habitual con los scripts es permitir ejecución a todos los usuarios que tengan permiso de lectura.
Ahora el fichero es ejecutable, por tanto podemos ejecutarlo desde la shell. No obstante, para que bash pueda localizarlo tenemos que proporcionar la ruta del fichero a ejecutar.
Para ello, en este caso, tenemos que indicar que el fichero está en el directorio actual de forma explicita. Si intentamos ejecutar el fichero de la siguiente forma, no funcionará:
La shell bash busca el comando o aplicación de la siguiente forma:
- Comando interno. En este caso no es un comando interno.
- En los directorios almacenados en la variable PATH
Si solo escribimos el nombre del script, bash entiende que es un scrip o binario que tiene que buscar en los directorios del PATH.
Si queremos ejecutar el script addEmpleado.sh tenemos que darle la ruta explicita del fichero. Podríamos haber escrito:
- ruta absoluta: /home/alumno/addEmpleado.sh
- rutas relativas: ./addEmpleado.sh
- Ruta con ~: ~/addEmpleado.sh
Vamos a intentar ejecutar el script con la ruta relavia.
Ahora el problema es que este script lleva a cabo tareas administrativas y tiene que ser ejecutado como root.
El problema de las variables
El problema de las variables es que cada vez que queramos cambiar el nombre del usuario para el que el script creará el directorio y lo configurará y creará la cuenta de usuario en caso necesario, tendremos que editar el script.
Supongamos que queremos preparar el sistema para un nuevo empleado: evaha. Para que el script utilice este nuevo usuario, tendremos que actualizar el valor de la variable usuario. Tan solo tendríamos que editar el script y volverlo a ejecutar.
Una vez realizado el cambio, nos aseguramos de guardar los cambios en el fichero.
Ahora ejecutamos de nuevo y vemos qué sucede.
Ahora, vamos a preparar el sistema para otro nuevo empleado: monicamz. Tendremos que editar el fichero, cambiar el valor de la variable, guardar los cambios y ejecutar el script.
Ejecutamos el script…
Esto empieza a ser un poco rollo… no obstante, estamos evitando tener que copiar y pegar o utilizar el historico de comandos para ejecutar seis comandos consecutivos.
Nuestro jefe, nos adelanta que tendremos que preparar el sistema para 30 nuevos empleados…….
Pasando un valor por parámetro
Si esto es nuevo para ti, no te asustes, lo veremos con más calma (es más puedes verlo ya en la entrada dedicada a parámetros dentro de la página de Bash Shell Script – shell scripts).
Lo que vamos a hacer es cambiar la forma en la que asignamos un valor a la variable usuario. En lugar de tener que escribir nosotros una y otra vez el valor a asignar a la variable desde el editor de texto, vamos a configurar nuestro script para que sea el propio interprete de comandos bash el que asigne un valor a dicha variable, en concreto el valor que se pase al script en el primer parámetro.
Ya sabemos que son los parámetros. Son cadenas de texto que se proporcionan a los comandos en el momento de ejecutarlos. Por ejemplo:
Hemos ejecutado la línea ls -lh /home. Bash analiza esta línea al pulsar el usuario Enter. De ahí concluye que se va a ejecutar el comando ls al cuál le pasa por primer parámetro la cadena -lh y como segundo parámetro la cadena /home
- Comando: ls
- Parámetro 1: -lh
- Parámetro 2: /home
Cómo use el comando ls la información que le pasamos por parámetro es cosa suya… De hecho, sabemos qué información le podemos pasar por parámetro al comando gracias a su página de manual.
En nuestros scripts podemos utilizar los parámetros que nos pase el operador o usuario que ejecute el script en tiempo de ejecución gracias a unas variables especiales. Estas variables son inicializadas por el interprete de comandos al ejecutarse el script con los valores pasados por parámetro.
Las variables especiales son las siguientes:
- $0. La cadena de texto usada para ejecutar el script.
- $1 .. $9. Los valores de los parámetros del 1 al 9. Por ejemplo, $1 guarda el primer parámetro.
- $@ ó $*. Una cadena de texto con todos los parámetros pasados
- $#. El número de parámetros que se han pasado al script.
Sabiendo esto, ¿cómo podemos modificar nuestro script para que tome en el primer parámetro el nombre del usuario?
Súper fácil, y además es algo muy muy recomendable, puesto que al final es como si le pusiéramos un nombre al parámetro.
Con esto, estamos evitando tener que editar el fichero cada vez que haya que crear un nuevo empleado.
Ahora vamos a crear un nuevo empleado llamado raquelru.
Le hemos pasado en el primer parámetro la cadena de texto raquelru. Nuestro script asigna a la variable usuario el valor del primer parámetro, que es raquelru. A partir de ahí, ejecuta el resto de comandos con la variable usuario.
¿Qué pasará si le pasamos dos parámetros? ¿Creará dos usuarios?
El script recibe los dos parámetros, la shell bash se encarga de inicializar cada una de las variables de $0..$9, $#, $@, $*… No obstante en nuestro código no utilizamos $2 en ningún sitio.
Que nos pasen un valor por parámetro no implica que tengamos que usarlo.
Control de errores y demás…
Aunque el script está bien y podemos utilizarlo desde ya, tiene varios problemas, uno de ellos grave: no estamos controlando errores en tiempo de ejecución
¿Qué sucede si el usuario no proporciona parámetro? ¿cuanto valdrá la variable usuario?. En este caso la variable usuario estará vacía y no valdrá nada, por lo que los comandos que se ejecutan darán un mensaje de error.
Esto deberíamos evitarlo, para ello deberíamos comprobar SI el primer parámetro está vacío. Si está vacío podríamos mostrar un mensaje de error y terminar la ejecución del script sin hacer nada.
Todo esto lo podemos ver y aprender en comprobación de parámetros y requisitos dentro de shell script con GNU/Linux bash.
Por ejemplo si ejecutamos el script sin pasar parámetros, se harán operaciones que no deberían realizarse porque son erroneas.
Al no pasar parámetro la variable usuario estará vacía.
El resultado será como ejecutar los siguientes comandos:
¿Cómo podemos tener el script disponible desde cualquier directorio del sistema?
Hemos visto que para poder ejecutar el script tenemos que escribir la ruta del fichero que lo contiene. Estaría muy bien poder ejecutarlo como si fuera un comando sin tener que escribir toda la ruta.
Cada vez que ejecutamos ping no escribimos la ruta completa del fichero binario o ejecutable del comando ping.
Todo el mundo puede ejecutarlo.
Este comando se puede ejecutar desde cualquier sitio, porque seguramente el directorio /usr/bin está en el path. Vamos a comprobarlo.
Si queremos que nuestro script se pueda ejecutar igual ping, tenemos dos opciones:
- Mover el fichero a alguno de estos directorios.
- Crear un directorio para scripts, añadirlo al PATH y mover el fichero a dicho directorio.
Mover el script a /usr/bin
Vamos a mover el script al directorio /usr/bin que está dentro del PATH y contiene binarios de sistema.
Vamos a crear un nuevo usuario.
Establecemos una nueva contraseña para romada, porque nos hemos confundido al insertarla en la creación. Para ello usamos el comando passwd.
Crear directorio de scripts
Vamos a optar por la segunda opción:
Hemos añadido el directorio /scripts al PATH, de esta forma bash va a buscar ejecutables en este directorio.
Al mover el fichero al directorio /scripts acabamos de dejar disponible el script para que pueda ser ejecutado desde cualquier sitio sin tener que escribir la ruta.
Vamos a añadir otro empleado: raulps
Dejar una respuesta