Todos estos conceptos que aparecen en el título de la entrada ya los hemos trabajado anteriormente. Esta entrada sirve como repaso o profundización de algunos de estos elementos a través de ejemplos prácticos.
No obstante, tenéis disponibles todos estos contenidos en la página dedicada a GNU/Bash shell scripts en este sitio web.
Variables y parámetros
- Una variables almacena un valor con un nombre identificativo. Es un dato que puede cambiar de valor a lo largo de la ejecución del programa.
- El nombre o identificador de una variable tiene que ser significativo.
- En shell script vamos a utilizar variables para almacenar datos que no cambian y que se utilizan varias veces en el código. Este tipo de datos se conocen como constantes y su valor suele ser un literal que utilizamos en el código.
- En general cuando desarrollemos scripts vamos a utilizar variables en los siguientes casos (salvo excepciones):
- Almacenar valores que se pasen por parámetro al script (funciones)
- Almacenar valores literales que se repitan en el script
- Almacenar datos cuyo valor pueda cambiar durante la ejecución
Un parámetro es un valor que se pasa al script en el momento de ejecutarlo, en tiempo de ejecución.
El Bash shell script los valores que se pasan por parámetro se asignan a una serie de variables especiales. Bash se encarga de asignar los valores pasados por parámetro a estas variables para que puedan ser utilizadas dentro de nuestro script.
Estas variables son las siguientes:
- $1..$9. Contienen el parámetro en la posición i-esima. Es decir $3 contiene el tercer parámetro pasado al script
- $@ Contiene todos los parámetros que se han pasado al script
- $* Contiene una cadena de texto con todos los parámetros pasados al script
- $# Número de parámetros que se han pasado al script
- $0 Almacena el comando o script que se ha ejecutado
showParametros.sh
Crea un script llamado showParametros.sh que muestre en pantalla con una etiqueta delante, el valor que tiene cada parámetro que se pasa al script. Por último mostrará todos los parámetros en una única línea de texto y el número de parámetros pasados.

Algunos resultados de su uso…

Código fuente

Hombre… si queremos mostrar solo los parámetros que nos han pasado y nada más, podríamos utilizar un bucle for, pero esto lo veremos más adelante (salvo que tengas ganas de practicar ahora). Si no te acuerdas y aún así eres intrépido tienes dos opciones, mirar la ayuda del bucle for (help for) o bien buscar en educatica (dejate de chatgpt, al menos por ahora)
Con el for sería algo así

No obstante esto puede generar un problema con parámetros que tengan comillas.

Esto se provoca por la variable $@ que contiene una cadena de texto con todos los parámetros, incluido el parámetro 3. Al unirse al resto de parámetros en una sola cadena de texto, el bucle for utiliza el espacio como separador recorre el contenido de los parámetros.
Si no hubieramos utilizando in $@ funcionaría como esperabamos 🙂


Otra vueltita…
Ahora queremos que el script compruebe si se han pasado parámetros o no. Si no se han pasado parámetros, entonces se mostrará una cadena de texto indicando que no se ha pasado ningún parámetro al script, sino mostrará la información de parámetros que hemos hecho hasta ahora.
Tenemos que usar el comando if para realizar una comprobación y ejecutar un conjunto de comandos u otro en función de si se cumple o no la condición. La dificultad aquí es entender que la condición de un comando if, porque es un comando, es un comando.

Si este comando se ejecuta correctamente, entonces se cumple la condición, sino no se cumplirá. El comando if utiliza el valor de retorno de la ejecución del comando para comprobar si se ha ejecutado correctamente o no.
Para comparar cadenas de texto, números enteros o información de ficheros se utiliza el comando test.


Está bien, pero si supiéramos algo de funciones podríamos intentar meter el cuerpo del then dentro de uno función e invocarla si se cumple la condición.
Algo así…

Pero esto, es probable que nos de problemas.

El problema aquí es que la forma de referenciar a los parámetros de una función y de un script es la misma. Es decir $@ si estamos en el cuerpo del script hace referencia al conjunto de parámetros pasados al script, sin embargo si la usamos dentro de una función, $@ hace referencia al conjunto de parámetros que se ha pasado a la función. Esto tiene que ver con el ámbito de las variables.
La solución más sencilla sería pasar por parámetro la lista de parámetros recibida por el script a la función.

checkNet.sh
Vamos a crear un pequeño script que comprobará si tenemos conexión con la puerta de enlace. En nuestro caso la puerta de enlace es 192.168.24.1. si tenemos conexión mostrará un mensaje indicando que hay conexión a la red. Si no tenemos conexión mostrará un mensaje indicando que no hay conexión de red con la puerta de enlace.

Vamos a ejecutarlo

No queremos que muestre nada de información el comando ping, para eso estamos mostrando nosotros un mensaje específico.

Salida


Vueltita va, vueltita viene
Queremos que nos pasen el host por parámetro. Por supuesto, si no me pasan parámetro mostraremos un mensaje de error y terminaremos la ejecución del script devolviendo un código de error.

Con [ -z $host ] se está ejecutando el comando test con la opción -z que comprobará si el valor de la variable host está vacía. Es decir, la expresión se cumplirá si el contenido de la variable host está vacía. Esto solo sucederá si no se ha pasado ningún valor por parámetro.

Otra vueltita…
Si no se pasa ningún por parámetro, en lugar de terminar la ejecución con un error, vamos a coger un host por defecto que será la puerta de enlace que es 192.168.24.1

Vamos a probar

Otra vueltita más..
Si no se pasa por parámetro ningún valor, se pedirá por teclado al usuario que inserte un valor por teclado.
Si aún así el usuario no escribe ningún valor para host, entonces usaremos el valor por defecto de la puerta de enlace.
Dejar una respuesta